外域是数组时的$ lookup [英] $lookup when foreign field is an array
本文介绍了外域是数组时的$ 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
$match
与ids
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屋!
查看全文