Подсчитать и суммировать длины массивов дочерних массивов, вложенных в документы - MongoDB / PHP - PullRequest
0 голосов
/ 02 сентября 2018

У меня есть документы 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'];

1 Ответ

0 голосов
/ 02 сентября 2018

Вам необходимо использовать $group с null и $sum $size массива child_array

$collection.aggregate([
  [ '$match' => [ 'type' => 'this_type' ] ],
  [ '$group' => [
    '_id' => null,
    'child_array' => [ '$sum' => [ '$size'=> '$child_array' ]]
  ]]
])

, который похож на javascript

db.collection.aggregate([
  { "$match": { "type": "this_type" }},
  { "$group": {
    "_id": null,
    "child_array": { "$sum": { "$size": "$child_array" }}
  }}
])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...