Vous pouvez utiliser map-reduce ou vous pouvez utiliser une simple requête group comme suit. Depuis que je suis en supposant que votre propriété de nom est une clé unique, cela devrait fonctionner même si ce n'est pas une raison que vous auriez normalement utiliser la fonction de groupe:
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}
});
Vous avez dit que vous avez un tableau de composants , mais il semble que vous stockez des composants en tant qu'objet {}
et non et le tableau []
. C'est pourquoi j'ai dû ajouter la boucle dans la fonction reduce, pour compter toutes les propriétés de l'objet components. S'il s'agissait en fait d'un tableau, vous pouvez simplement utiliser la propriété .length
.
En PHP, il ressemblerait à quelque chose comme ça (du 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);
Enfin, je suggère fortement que si vous essayez d'accéder au nombre de vos composants sur une base régulière que vous stockez le compte comme une propriété supplémentaire du document et le mettre à jour chaque fois qu'il change. Si vous tentez d'écrire des requêtes filtrées en fonction de ce nombre, vous pourrez également ajouter un index sur cette propriété.
Veuillez fournir un exemple (le résultat attendu de la requête). –
lire la deuxième partie de la question; enlevé ma réponse. – Petrogad
Exemple de résultat serait quelque chose comme {nom: 'Nom de l'élément', composants: 3} – JimBlizz