Выполнить $ lookup для массива идентификаторов объектов в mongodb? - PullRequest
0 голосов
/ 10 мая 2018

У меня есть две коллекции под названием BlogCategory и SubBlogCategory . Документ BlogCategory состоит из массива objectId идентификатора подкатегории.

Документ категории выглядит следующим образом

{ 
    "_id" : ObjectId("5af2c6e8bfab7269e9a42ded"), 
    "title" : "Javascript", 
    "subcategory" : [
        ObjectId("5af29fcc9a52623b7088ef4e"), 
        ObjectId("5aebf78681273424e5f55ecc")
     ]
}

Документ подкатегории выглядит следующим образом

{ 
    "_id" : ObjectId("5af29fcc9a52623b7088ef4e"), 
    "title" : "Reactjs"
}
{ 
    "_id" : ObjectId("5aebf78681273424e5f55ecc"), 
    "title" : "Vuejs", 
}

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

Я использовал следующий запрос, но он заполнял только один идентификатор массива

db.BlogCategory.aggregate([
   {
     $unwind: "$subcategory"
   },
   {
      $lookup:
      {
          from: "SubBlogCategory",
          localField: "subcategory",
          foreignField: "_id",
          as: "sub_doc"
     }
   }
])

1 Ответ

0 голосов
/ 10 мая 2018

Нет необходимости $unwind здесь ... $ unwind дублирует каждый документ в конвейере, один раз для каждого элемента массива.

db.BlogCategory.aggregate([
   {
      $lookup:
      {
          from: *Collection_Name*,
          localField: "subcategory",
          foreignField: "_id",
          as: "sub_doc"
     }
   }
])

если вы используете mongodb версии 3.6, вы можете использовать конвейер

db.BlogCategory.aggregate([
              { "$lookup": {
                "from": *Collection_Name*,
                "let": { "subcategory": "$subcategory" },
                "pipeline": [
                   { "$match": { "$expr": { "$in": [ "$_id", "$$subcategory" ] } } }
                 ],
                 "as": "sub_doc"
              }}
            ])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...