Строка проекта агрегации 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. Зачем вам нужно преобразовать строку? что ты собираешься с этим делать? Возможно, есть способ избежать отсутствия оператора преобразования в агрегации.