2016-04-04 8 views
0

Sprich, ich habe folgende Dokumente:mongodb Aggregationsanfrage für Summe der Feldwert Länge

{name: 'A', fav_fruits: ['apple', 'mango', 'orange'], 'type':'test'} 
{name: 'B', fav_fruits: ['apple', 'orange'], 'type':'test'} 
{name: 'C', fav_fruits: ['cherry'], 'type':'test'} 

ich die Gesamtzahl der fav_fruits Feld durch zurück auf Gesamt Dokumenten abfragen bin versucht zu finden:

cursor = db.collection.find({'type': 'test'}) 

ich erwarte eine Ausgabe wie:

cursor.count() = 3 // Getting 

Ohne viel Ahnung von Aggregat kann, MongoDB aggregat helfen Sie mir Ionen Rahmen erreichen dies in irgendeiner Weise:

1. sum up the lengths of all 'fav_fruits' field: 6 

und/oder

2. unique 'fav_fruit' field values = ['apple', 'mango', 'orange', 'cherry'] 

Antwort

0

Tun Sie dies nur die Anzahl der Früchte im fav_fruits Array zu erhalten:

db.fruits.aggregate([ 
    { $match: { type: 'test' } }, 
    { $unwind: "$fav_fruits" }, 
    { $group: { _id: "$type", count: { $sum: 1 } } } 
]); 

Dieser Wille gib die Gesamtzahl der Früchte zurück.

Aber wenn man die Reihe von einzigartigen fav_fruits zusammen mit der Gesamtzahl der Elemente im fav_fruits Feld jedes Dokument erhalten möchten, dies tun:

db.fruits.aggregate([ 
    { $match: { type: 'test' } }, 
    { $unwind: "$fav_fruits" }, 
    { $group: { _id: "$type", count: { $sum: 1 }, fav_fruits: { $addToSet: "$fav_fruits" } } } 
]) 
0

Sie können dies versuchen. Es kann hilfreich für Sie sein.

db.collection.aggregate([{ $match : { type: "test" } }, {$group : { _id : null, count:{$sum:1} } }]) 
0

Sie benötigen Dokument nach dem $match Bühne $project und verwenden Sie den $size Operator, der die Anzahl der Elemente in jedem Array zurück. In der Phase $group verwenden Sie dann den Akkumulatoroperator $sum, um die Gesamtanzahl zurückzugeben.

db.collection.aggregate([ 
    { "$match": { "type": "test" } }, 
    { "$project": { "count": { "$size": "$fav_fruits" } } }, 
    { "$group": { "_id": null, "total": { "$sum": "$count" } } } 
]) 

Welche zurück:

{ "_id" : null, "total" : 6 } 

einzigartig Um fav_fruits einfach .distinct() verwenden

> db.collection.distinct("fav_fruits", { "type": "test" }) 
[ "apple", "mango", "orange", "cherry" ] 
Verwandte Themen