Монго множественный поиск в любых коллекциях

#mongodb #aggregation-framework

#mongodb #агрегация-фреймворк

Вопрос:

Я пытаюсь настроить запрос в mongo, который выполняет поиск в 3 разных коллекциях.

Документ клиента:

 {  
   "_id": ObjectId("1a")
   "razaosocial:"32423424",
   "prepository": [
     {
       "$ref": "prepository",
       "$id": ObjectId("2a")
     }
   ]
}
  

Предварительный документ:

 {  
   "_id": ObjectId("2a")
   "name:"Jonh",
   "prepository": {
       "$ref": "representative",
       "$id": ObjectId("3a")
     }
}
  

Документ представителя:

 {  
   "_id": ObjectId("3a")
   "name:"Josh"
}
  

Я делаю это таким образом, но это ничего не возвращает:

 db.clients.aggregate(
[
  {
     $lookup: {
            from: 'prepository',
            localField: 'prepository',
            foreignField: 'id',
            as: 'prepository'
     }
  },  
  { $unwind: "$prepository" },
  { $lookup: {
    from: 'representative',
    localField: 'id',
    foreignField: 'prepository._id',
    as: 'prepository.repre'
   }
  },
  { $group: {
    _id: "$_id",
    client: { $first: "$razaosocial" },
    users: {
      $push: "$prepository"
   }
  } }
])
  

Я пытаюсь вернуть

 {  
   "_id": "1a"
   "razaosocial:"32423424",
   "prepository": [
      {
         "_id": "2a"
         "name:"Jonh",
         "representative": {
            "_id": "3a"
            "name:"Josh"
         }
      }
   ]
}
  

Я благодарен за любую помощь

Комментарии:

1. Да, я исправлю

Ответ №1:

Вы можете использовать вложенный поиск,

  • $lookup с prepository коллекцией
  • $match с prepository идентификатором
  • $lookup с representative коллекцией
  • $unwind деконструировать representative массив
 db.client.aggregate([
  {
    $lookup: {
      from: "prepository",
      as: "prepository",
      let: { prepository: "$prepository" },
      pipeline: [
        { $match: { $expr: { $in: ["$_id", "$$prepository"] } } },
        {
          $lookup: {
            from: "representative",
            localField: "representative",
            foreignField: "_id",
            as: "representative"
          }
        },
        { $unwind: "$representative" }
      ]
    }
  }
])
  

Игровая площадка