外域是数组时的$ lookup [英] $lookup when foreign field is an array

查看:151
本文介绍了外域是数组时的$ 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"),
             ...
        }]
}

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

I want to show the booking details. While joining two collections, sport details cannot be fetched.

我尝试过:

     $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": []

有人可以帮我吗?

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

Update : I tried pipe lining in look up as follows. But still empty result

 ['$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", 
        ]
        },

推荐答案

您可以在下面的聚合中使用

You can use below aggregation

您可以使用新的 $lookup 语法为 $unwind

You can use new $lookup syntax to $unwind the foreign array inside the $lookup pipeline and then can easily $match with ids

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
  }}
])

这篇关于外域是数组时的$ lookup的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆