Вы можете использовать map-lower или простой group запрос следующим образом. Поскольку я предполагаю, что ваше свойство name является уникальным ключом, это должно сработать, хотя это не является причиной, по которой вы обычно используете групповую функцию:
db.test.group({
key: { name:true },
reduce: function(obj,prev) {
var count = 0;
for(k in obj.components)
count++;
prev.count = count;
},
initial: { count: 0}
});
Вы упомянули, что у вас есть массив компонентов, но похоже, что вы храните компоненты как объект {}
, а не как массив []
. Вот почему мне пришлось добавить цикл в функцию Reduce, чтобы подсчитать все свойства объекта компонентов. Если бы это был массив, то вы могли бы просто использовать свойство .length
.
В PHP это будет выглядеть примерно так (из Manual ):
$keys = array('name' => 1);
$initial = array('count' => 0);
$reduce =<<<JS
function(obj,prev) {
var count = 0;
for(k in obj.components)
count++;
prev.count = count;
},
JS;
$m = new Mongo();
$db = $m->selectDB('Database');
$coll = $db->selectCollection('Collection');
$data = $coll->group($keys, $initial, $reduce);
Наконец, я настоятельно рекомендую, чтобы, если вы пытаетесь регулярно получать доступ к счетчику ваших компонентов, вы сохраняли счетчик как дополнительное свойство документа и обновляли его всякий раз, когда он изменяется. Если вы пытаетесь написать запросы, которые фильтруются на основе этого количества, вы также сможете добавить индекс для этого свойства компонентов.