#mongodb #meteor #mongodb-query #meteor-blaze #angular-meteor
#mongodb #meteor #mongodb-запрос #meteor-blaze #angular-метеор
Вопрос:
Итак, у меня есть коллекции, projects
в которых есть поле contacts.envCon.$id
:
{
"contacts" : {
...
"envCon" : {
"$ref" : "contacts",
"$id" : ObjectId("5807966090c01f4174cb1714") <---- NOTICE!!!
}
...
}
}
На contacts
объекте коллекции с идентификатором Example12345
выглядит так:
{
"_id" : ObjectId("5807966090c01f4174cb1714"),
"name" : "Terracon"
}
Итак, я попробовал следующий $lookup из aggregation framework:
db.getCollection('projects').aggregate([
{
$lookup:{
from: "contacts",
localField: "contacts.envCon.id",
foreignField: "id",
as: "example"
}
}
]);
Но он не выполняет ОБЪЕДИНЕНИЕ, чего мне не хватает? как выполнять поиск между 2 коллекциями, используя contacts.envCon.id
из проектов и _id
из контактов.
Я использую meteor на всякий случай.
Ответ №1:
Я не уверен, что происходит с вашими значениями ObjectId; Я даже не могу вставить значение поля ObjectId («Example12345»). Разница в значениях ObjectId между двумя коллекциями, вероятно, является причиной сбоя $lookup.
Предоставленный вами запрос агрегации работает в моей среде, когда я разрешаю MongoDB генерировать значение _id ObjectId в «контактах» и сохранять то же значение в коллекции «проекты».
$ db.projects.find().pretty()
{
"_id" : ObjectId("580832011b3c40dba2ae6e32"),
"contacts" : {
"envCon" : DBRef("contacts", ObjectId("580831d61b3c40dba2ae6e31"))
}
}
$ db.contacts.find().pretty()
{ "_id" : ObjectId("580831d61b3c40dba2ae6e31"), "name" : "Terracon" }
$ db.getCollection("projects").aggregate([ { "$lookup" : { "from" : "contacts", "localField" : "contacts.envCon.id", "foreignField" : "id", "as" : "example" } } ]).pretty()
{
"_id" : ObjectId("580832011b3c40dba2ae6e32"),
"contacts" : {
"envCon" : DBRef("contacts", ObjectId("580831d61b3c40dba2ae6e31"))
},
"example" : [
{
"_id" : ObjectId("580831d61b3c40dba2ae6e31"),
"name" : "Terracon"
}
]
}
Комментарии:
1. Его идентификаторы объектов являются собственными идентификаторами mongodb, а не сгенерированными Meteor.
2. идентификаторы — это просто ПРИМЕРЫ, я не хотел копировать весь lond id, просто пример, чтобы сделать его более читаемым, я отредактировал его, чтобы включить в оба реальных идентификатора.
3. Я обновил свой ответ, чтобы показать, что агрегация работает. Как агрегация ведет себя в вашей среде в этом примере?