У меня есть таблица общежития, например
{
_id: ...,
Name: ....,
SchoolId: ...,
AllotmentsDetails: [
...,
...,
],
RoomsDetails:
[
{
NumberOfBeds: 4
....
},
{
NumberOfBeds: 5
....
}
]
}
Я хочу рассчитать общее количество мощностей в общежитии.В приведенном выше примере должно быть 9 (сумма всех полей NumberOfBeds во встроенном документе RoomsDetails).Я пробовал ниже строки кода.
$query = array('SchoolId' => new MongoDB\BSON\ObjectID($this->SchoolId));
// Actual Aggregation
$pipeline = array(
array(
'$match' => $query
),
[ '$addFields'=> [
'AllotmentsDetails'=> [
'$cond'=> [
'if'=> [
'$ne'=> [ [ '$type'=> '$AllotmentsDetails' ], 'array' ]
],
'then'=> [],
'else'=> '$AllotmentsDetails'
]
]
]],
[
'$addFields' => [
'NonExpiredAllotments' => [
'$map' => [
'input' => '$AllotmentsDetails',
'as' => 'item',
'in' => [
'$cond' => [
['$gt' => ['$$item.ToDate', new MongoDB\BSON\UTCDateTime((new DateTime())->getTimestamp() * 1000)]],
'$$item.AllotmentId',
false
]
]
]
]
]
],
[
'$addFields' => [
'TotalNumberOfCapacities' => [
['$sum' => [ 'RoomsDetails.NumberOfBeds']]
]
]
]
);
$cursor = $this->collection->aggregate($pipeline)
Вывод
array(1) { [0]=> object(MongoDB\Model\BSONDocument)#37 (1) { ["storage":"ArrayObject":private]=> array(12) { ["_id"]=> object(MongoDB\BSON\ObjectId)#13 (1) { ["oid"]=> string(24) "5bc087ddd2ccda0eb4004711" } ["Name"]=> string(3) "rrr" ..............
} ["TotalNumberOfCapacities"]=> object(MongoDB\Model\BSONArray)#36 (1) { ["storage":"ArrayObject":private]=> array(1) { [0]=> int(0) } } } } }
Он не рассчитывается должным образом Пожалуйста, помогите !!!
Вот актуальный встроенный документ
"RoomsDetails": [
{
"RoomId": "9f9b510c-9753-f410-8f79-f0b04affb7a2",
"FloorNumber": "1",
"RoomNumber": "101",
"RoomType": ObjectId("5b0ceee0bb2c561448001cc5"),
"NumberOfBeds": "4",
"Available": NumberInt(3),
"BayId": ObjectId("5bc087dcd2ccda0eb400470f")
},
{
"RoomId": "789b510c-9753-f410-8f79-f0b04affb768",
"FloorNumber": "1",
"RoomNumber": "102",
"RoomType": ObjectId("5b0ceee0bb2c561448001cc5"),
"NumberOfBeds": "5",
"Available": NumberInt(3),
"BayId": ObjectId("5bc087dcd2ccda0eb400470f")
}
],