MongoDB использует aggregate и $lookup для имитации ОБЪЕДИНЕНИЯ коллекций в Mongo

#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. Я обновил свой ответ, чтобы показать, что агрегация работает. Как агрегация ведет себя в вашей среде в этом примере?