У меня есть две коллекции.
Спорт
{
"_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",
]
},