MongoDB-query-Kriterien und Projektionen
Ich bin bulding eine app mithilfe von Knoten - /Express - /MongoDB/Mongoskin.
Ich die Datenbank habe ich eine Sammlung Datei "Kunden", wo die Dokumente, die Informationen über Kunden-account. Jede client-Dokument enthält ein array mit Rechnung-Objekte wie diese:
doc.invoices = [
{year: 2012,
quarter: 1,
daily: 912.00,
sms: 42.00,
paid: true},
{year: 2012,
quarter: 2,
daily: 913.00,
sms: 55.00,
paid: true},
{year: 2012,
quarter: 3,
daily: 876.00,
sms: 82.00,
paid: true},
{year: 2012,
quarter: 4,
daily: 903.00,
sms: 93.00,
paid: false},
{year: 2013,
quarter: 1,
daily: 915.00,
sms: 67.00,
paid: true},
{year: 2013,
quarter: 2,
daily: 920.00,
sms: 35.00,
paid: true},
{year: 2013,
quarter: 3,
daily: 880.00,
sms: 92.00,
paid: true},
{year: 2013,
quarter: 4,
daily: 900.00,
sms: 85.00,
paid: false}
]
Frage: Können sagen, ich möchte die Abfrage ALLE Dokumente aus dieser Sammlung, wie in einem "Superadmin" -Ansicht zeigt alle clients, aber ich will zur Begrenzung der zurückgegebenen Informationen von der Rechnung-array-Objekte, wobei mit "Jahr" ist gleich einem bestimmten Wert, zum Beispiel 2013 das aktuelle Jahr.
Ich denke Projektionen ist, was ich brauche, aber das problem ist, dass die Projektion ist nur die Rückgabe der ersten Folge findet er...
- Die Verwendung
aggregate
stattfind
mit der$unwind
Betreiber. - Was hat deine Abfrage Aussehen?
Du musst angemeldet sein, um einen Kommentar abzugeben.
zunächst, Projektion nicht zurück, wird das erste Ergebnis findet er es sagt mongo was zurück.
.findOne(query) schränkt das Ergebnis auf eine oder find(query).limit(1) wird auch das gleiche tun.
Ihnen sagen, dass Sie versuchen, "alle" Ihre Daten.
einen standard finden, geben Sie query wird erhalten Sie begann...
aber Grenzen, die Ergebnisse in einen cursor von der mongo shell*
da Sie sagte, dass Ihre Verwendung express.js verwenden Sie eine javascript-Funktion "Rückkehr" die Ergebnisse einer einfach zu finden, wie diese...
durch einrichten einer route, um eine Funktion
und dann eine Funktion zu, die mit Ihren einfachen mongo query und Projektion.
schließlich möchten Sie vielleicht zu Folgen, einen tutorial für express-und mongo, es gibt einige gute, ich habe diese Antwort zusammen basierend auf eine ausgezeichnete starter von Chris Coenraets sehen:-
http://coenraets.org/blog/2012/10/creating-a-rest-api-using-node-js-express-and-mongodb/
Daran erinnern, dass Prognosen erlaubt uns explizit einschließen oder ausschließen von Bereichen in einem
MongoDB
Abfrage. Wir verwenden1
, um anzugeben, dass ein Feld enthalten, und0
zu zeigen, dass wir ausschließen möchten, das Feld. Denken Sie daran, dass_id
ist ein besonderes Feld -_id
Feld wird standardmäßig enthalten, es sei denn, wir hätten ausdrücklich ausschließenAuch, denn wir arbeiten in
javascript
können wir konstruieren unsere Projekt-Unterlagen und-Dokumente eingefügt werden, in unsere Sammlungen in einer Weise, die sehr ähnlich zu der Art, wie wir diese in dermongo
shell. Was anders ist, ist der Treiber bietet eine Reihe von Klassen und Methoden, die wir verwenden, um die Interaktion mitMongoDB
und diemongo
shell bietet eine eigene API.W. r. t.
CRUD
als derMongoDB 3.2
den Fahrer und diemongo
shell Einhaltung der gleichen Skillung. Wie Sie den Zugriff auf diese Methoden und wie Sie umgesetzt wird, variiert natürlich von dermongo
shell.Den aktuellen best-practice in der
node.js
- Treiber, ist die Kette ein Aufrufproject
auf unserercursor
d.h.cursor.project
. Dieser Aufruf Projekt setzt ein Feld der Projektion für die Abfrage. Dieser Aufruf nicht zwingen, eine Anforderung zum abrufen von Dokumenten aus der Datenbank, wie dieforeach
Methode. Vielmehr fügt einige zusätzliche details zu der Abfrage, Darstellung, betreut durch unserecursor
. Es sind eine Anzahl von cursor-Methoden können wir die Kette gemeinsam zu entfalten, die wir wollen, führen gegen unsereMongoDB
Datenbank. Der Aufrufdb.collection
synchron ist. Wir gehen zu ändern, dasscursor
mit einem Feldprojection
hier über dieproject
Methode auf den cursor.nicht sicher, ob ich verstanden :
dieser liefert Ihnen alle Kunden, die im Jahr 2013 gleich, es gibt Sie alle Dokument-Feld
Die Projektion, die Sie sprechen, das ist zur Begrenzung der von der Abfrage zurückgegebenen Felder, ich meine :
diese gibt Sie ein array von Objekten, in denen Jahr 2013 UND jedes Objekt bekommt 2 Felder (bezahlt und Jahr)
den "{year:1,Gewinn:1}" Objekt ist Ihrem Projektor.
Als @JohnnyK erwähnt in seinem Kommentar, den Sie verwenden sollten, MongoDB aggregation framework:
At-Sie entspannen anfänglichen
invoices
array, dann halten Sie nur die Rechnungen mit dem angegebenen Jahr und Gruppe abgestimmt Rechnungen in ein array von client-Felder am Ende.