Строка проекта агрегации MongoDB для ObjectId

Я пытаюсь преобразовать шестнадцатеричную строку в ее эквивалентный ObjectID в запросе агрегирования. Я пробовал два разных метода:

db.omvas.aggregate([
    {$project:{
        EID:{$let: {
               vars: {
                  id:  "$EID"
               },
               in: ObjectId("$$id")
            }},
        }
    },
    {$group:{
        _id:"$EID"
        }
    }
]);

и

db.omvas.aggregate([
    {$project:{
        EID: ObjectId("$EID")
        }
    },
    {$group:{
        _id:"$EID"
        }
    }
]);

Я продолжаю получать ошибку "Ошибка: недопустимый идентификатор объекта: длина" с помощью любого метода. Я тестировал добавление литеральной строки вместо переменной агрегации, и я получаю результат с соответствующим ObjectID. Похоже, что строковое значение не передается функции Mongo ObjectId, а имя переменной передается как буквальная строка.

Кто-нибудь знает, возможно ли то, что я пытаюсь сделать? Есть ли какая-то магия, которой я не хватает?

Ответ 1

ObjectId является конструктором для ObjectIds в оболочке. Когда вы пишете что-то вроде

"EID" : { "$let" : {
           "vars" : { "id" :  "$EID" },
           "in" : ObjectId("$$id")
        } }

оболочка mongo оценивает ObjectId("$$id") перед отправкой запроса агрегации. Это просто, если вы вызвали функцию в Javascript, например

var x = 2
var y = 4
f(x + y) // f(6)

Вам нужен оператор агрегирования для преобразования строки в ObjectId. К сожалению, такой функции нет, как у MongoDB 2.6. Зачем вам нужно преобразовать строку? что ты собираешься с этим делать? Возможно, есть способ избежать отсутствия оператора преобразования в агрегации.