У меня есть документы MongoDB, такие как:
{
"_id": "object1",
"type": "this_type",
"child_array": [
{...other fields here...},
{...other fields here...},
{...other fields here...}
],
"some_other_key": "some_value"
},
{
"_id": "object2",
"type": "this_type",
"child_array": [
{...other fields here...},
{...other fields here...}
],
"some_other_key": "some_value"
},
{
"_id": "object3",
"type": "this_type",
"child_array": [
{...other fields here...},
{...other fields here...},
{...other fields here...},
{...other fields here...}
],
"some_other_key": "some_value"
}
Можно ли посчитать, сколько вложенных детей у child_array
с?
Я сейчас использую это, но он возвращает 3
, потому что 3 документа имеют child_array
.
$collection = $mongodb->my_collection;
$nested_count_filter = [ "type" => "this_type", "child_array" => ['$exists' => true] ];
$nested_count = $collection->count($nested_count_filter);
Мне нужно, чтобы он возвратил 9
для этого примера, так как у первого документа 3, у второго 2, а у 3 4, всего 9 вложенных детей.
Есть ли способ MongoDB сделать это, или я должен сделать это вручную (например, для циклов)?
ОБНОВЛЕНИЕ - Решение
Я пытался:
$mongo_count = $collection.aggregate([
[ '$match' => [ 'type' => 'this_type' ] ],
[ '$group' => [
'_id' => null,
'child_array' => [ '$sum' => [ '$size'=> '$child_array' ]]
]]
]);
Чтобы получить действительные значения, после использования метода в принятом ответе объект курсора Монго должен быть преобразован в массив:
$count_array = iterator_to_array($mongo_count);
$count = $count_array[0]['child_array'];