Внешнее поле $ lookup может быть полем вложенного документа? - PullRequest
0 голосов
/ 24 сентября 2018

$ lookup используется для выполнения внешнего левого соединения с неотмеченной коллекцией в той же базе данных для фильтрации документов из «объединенной» коллекции для обработки в Mongo.

{
   $lookup:
     {
       from: <collection to join>,
       localField: <field from the input documents>,
       foreignField: <field from the documents of the "from" collection>,
       as: <output array field>
     }
}

Может ли foreignField быть полем вложенного документа коллекции from?

Например, есть две коллекции:

history collection

 [{
  id:'001',
  history:'today worked',
  child_id:'ch001'
},{
  id:'002',
  history:'working',
  child_id:'ch004'
},{
  id:'003',
  history:'now working'
  child_id:'ch009'
}],

childsgroup collection

[{
  groupid:'g001', name:'group1'
  childs:[{
      id:'ch001',
      info:{name:'a'}
  },{
      id:'ch002',
      info:{name:'a'}
  }]
},{
  groupid:'g002', name:'group1'
  childs:[{
      id:'ch004',
      info:{name:'a'}
  },{
      id:'ch009',
      info:{name:'a'}
  }]
}]

Итак, этот aggregation код может быть выполнен следующим образом?

db.history.aggregate([
   {
     $lookup:
       {
         from: "childsgroup",
         localField: "child_id",
         foreignField: "childs.$.id",
         as: "childinfo"
       }
  }
])

Итак, я хочу получить такой результат.

     [{
      id:'001',
      history:'today worked',
      child_id:'ch001',
      childinfo:{
          id:'001',
          history:'today worked',
          child_id:'ch001'
       }
    },  .... ]

Разве это не возможно?

1 Ответ

0 голосов
/ 24 сентября 2018

Там нет позиционного оператора для $ lookup, но вы можете использовать пользовательский pipeline в MongoDB 3.6 для определения пользовательского объединения условия :

db.history.aggregate([
    {
        $lookup: {
            from: "childsgroup",
            let: { child_id: "$child_id" },
            pipeline: [
                { $match: { $expr: { $in: [ "$$child_id", "$childs.id" ] } } },
                { $unwind: "$childs" },
                { $match: { $expr: { $eq: [ "$childs.id", "$$child_id" ] } } },
                { $replaceRoot: { newRoot: "$childs" } }
            ],
            as: "childInfo"
        }
    }
])

Сначала $match добавлено для повышения производительности: мы хотим найти только те документы из childsgroup, которые содержат соответствующие child_id, а затем мы можем сопоставить вложенные документы после этапа $unwind.

...