我有两个收藏。
体育:
{
"_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",
]
},
答案 0 :(得分:2)
您可以使用以下汇总
您可以使用新的$lookup
语法来$unwind
管道内的$lookup
外来数组,然后可以轻松地$match
和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
}}
])