外域是数组时的$ lookup

时间:2018-11-06 06:21:45

标签: mongodb laravel mongodb-query aggregation-framework lookup

我有两个收藏。

体育

{
    "_id" : ObjectId("5bcaf82120e047301b443c06"),
    "item_name" : "Football",
    "item_icon" : "ps_icon_football.png", 
    "slot_divisions" : {
    "0" : {
        "div_id" : ObjectId("5bd037ec5021b307e793f7b3"),
        "description" : "5x5"
    },
    "1" : {
        "div_id" : ObjectId("5bd0384b5021b307e793f7b4"),
        "description" : "7x7"
    }
 })

预订

{
    "_id" : ObjectId("5be015bd870565038c7660f4"),
    "spot" : ObjectId("5bd825cb8705651b1c2f17e2"),
    "date" : ISODate("2018-11-13T10:04:45.000Z"),
    "slots" : [ 
        {
            "booking_id" : ObjectId("5be015bd870565038c7660f3"),
            "slot_id" : ObjectId("5bd0384b5021b307e793f7b4"),
             ...
        }]
}

我想显示预订详细信息。加入两个系列时,无法获取运动细节。

我尝试过:

     $bookData  =   Booking::raw(function($collection) use($request) {
                   ....
            return $collection->aggregate([
               ['$lookup' => ['from'=>'spots', 'localField'=>'spot_id', 'foreignField'=>'_id', 'as'=>'spot_data']],
               ['$lookup' => ['from'=>'sports_items', 'localField'=>'slots.slot_id', 'foreignField'=>'slot_divisions.div_id', 'as'=>'sports_data']],
               ['$unwind'  =>'$slots'],
               ['$project' => [
                    'booking_id'=>'$slots.booking_id',
                    'date'=>'$date',
                    'sports_data.item_name'=>'$sports_data.item_name',
                    'sports_data.item_icon'=>'$sports_data.item_icon',
                ]],

            ]);
        });

我得到了答复:

"sports_data": []

有人可以帮我吗?

更新: 我尝试如下查找管道衬里。但是结果还是空的

 ['$lookup' => ['from'=>'sports_items', 'localField'=>'slots.slot_id', 'foreignField'=>'slot_divisions.div_id', 'as'=>'sports_data']],   

更改为

      ['$lookup' => [
                    'from'=>'sports_items_collection',
                     'pipeline' =>[
                         ['$unwind'  =>'$slot_divisions'],
                         ['$match'=>["slots.slot_id"=>['$eq'=> ["slot_divisions.div_id"]]]]
                     ],
                     'as'=>'sports_data'
                   ]],

我的预期输出是:

  "booking": [
        {
            "booking_id": "5be015bd870565038c7660f3",
            "date": "2018-11-13 15:34:45",
            "sports_data": [
        "item_name" : "Football",
        "item_icon" : "ps_icon_football.png", 
        ]
        },

1 个答案:

答案 0 :(得分:2)

您可以使用以下汇总

您可以使用新的$lookup语法来$unwind管道内的$lookup外来数组,然后可以轻松地$matchids

db.bookings.aggregate([
  { "$lookup": {
    "from": "sports",
    "let": { "slot_id": "$slots.slot_id" },
    "pipeline": [
      { "$unwind": "$slot_divisions" },
      { "$match": { "$expr": { "$in": ["$slot_divisions.div_id", "$$slot_id"] }}},
      { "$project": { "item_name": 1, "item_icon": 1 }}
    ],
    "as": "sports_data"
  }},
  { "$project": {
    "booking_id": { "$arrayElemAt": ["$slots.booking_id", 0] },
    "date": 1,
    "sports_data": 1
  }}
])
相关问题