2017-04-16 5 views
1

Ich habe Daten wie folgt aus:Mongoose FindOne zurückzukehren Anzahl der Objektunterarray

{ 
    "profileID": "123456789", 
    "myArray": [ 
    { 
     "read": false 
    }, 
    { 
     "read": true 
    }, 
    { 
     "read": false 
    }, 
    { 
     "read": true 
    } 
    ] 
} 

Ich möchte die Anzahl der zu bekommen, um in der Lage: myArray wo lesen ist falsch. Ich muss das auf Mongoose machen. Im obigen Beispiel ist die gewünschte Rückgabe .

Mein FindOne ist wie unten:

userModel.findOne({'profileID': 123456789}, function(err, myArray) { 
    //Code to run here 
}); 

Ich kann manuell über die Reaktion laufen und meine Zählung, die Art und Weise machen, aber das wird sehr ineffeciant sein.

Wie bekomme ich die Anzahl der myArray ungelesene Werte des Benutzers auf der Datenbankebene?

Dank

Antwort

2

Sie aggregate verwenden sollten:

> db.bla.insert({ 
... "profileID": "123456789", 
... "myArray": [ 
...  { 
...  "read": false 
...  }, 
...  { 
...  "read": true 
...  }, 
...  { 
...  "read": false 
...  }, 
...  { 
...  "read": true 
...  } 
... ] 
... }) 
WriteResult({ "nInserted" : 1 }) 

> db.bla.aggregate([{$match:{"profileID":"123456789"}}, {$unwind:"$myArray"}, {$match:{"myArray.read":false}}, {$count:"unread_mail"}]) 
{ "unread_mail" : 2 } 

Sie können dann $unwind Array Ihre Zählung zu tun.

+1

wirkt wie ein Zauber Kumpel zu zählen! Anfangs hatte ich ein Problem mit ** $ count **, aber dann habe ich die Dokumentation für Mongo nachgeschlagen, dass es in Version 3.4 eingeführt wurde und ich auf Version 3.2.x war. Alles gut nach dem Upgrade. Vielen Dank! –

0

Sie können findOne nicht verwenden, um Arrays zu filtern, bei denen Sie mehrere Übereinstimmungen erwarten.

Sie können $filter und $size in einer Aggregationsabfrage verwenden.

Die folgende Abfrage wird $filtermyArray wo read false $size folgt die Filter Artikel

db.collection.aggregate(
    { $match: { profileID: "123456789" } }, 
    { $project: {size: { $size: { $filter: { input: "$myArray", as: "result", cond: { $eq: ["$$result.read", false] } } } } } } 
) 
Verwandte Themen