MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

Rufen Sie eine einzelne Eigenschaft aus dem Dokument ab

In MongoDB 2.0 und älter ist dies nicht möglich. Was Sie tun möchten, ist ein bestimmtes Element des Arrays zurückzugeben - aber das ist nicht das, was Ihre Projektion tatsächlich tut, sie gibt nur das gesamte Array zurück und dann das z-Element von jedem.

Mit 2.2 (rc2 zum Zeitpunkt des Schreibens dieser Antwort) sind die Dinge jedoch etwas besser geworden. Sie können jetzt $elemMatch verwenden als Teil Ihrer Projektion (siehe SERVER-2238 ). für Details), sodass Sie nur das erforderliche Array-Element zurückziehen. Versuchen Sie also Folgendes:

db.foo.find({"ID":"123",'a':{$elemMatch:{'x':"/"}}},{_id : 0, 'a.$': 1})
//returns
{ "a" : [ { "x" : "/", "y" : "2000", "z" : "1000" } ] }

Oder verwenden Sie einfach $elemMatch in der Projektion selbst, was Ihrer Meinung nach sauberer ist:

db.foo.find({"ID":"123"},{_id : 0, 'a':{$elemMatch:{'x':"/"}}})
//returns 
{ "a" : [ { "x" : "/", "y" : "2000", "z" : "1000" } ] }

Jetzt ist also zumindest das zurückgegebene Array nur dasjenige, das nur die gewünschten Einträge enthält, und Sie können einfach auf das relevante z-Element verweisen (elemMatch-Projektionen auf ein Filialdokument werden noch nicht unterstützt).

Zu guter Letzt haben wir in 2.2 das Aggregations-Framework und eines der Dinge, die es tun kann (mit dem $project Operator, besteht darin, Ihre Dokumente umzugestalten und Unterdokumente und Array-Elemente in Arrays der obersten Ebene umzuwandeln. Um das gewünschte Ergebnis zu erhalten, würden Sie etwa so vorgehen:

db.foo.aggregate( 
        {$match : {"ID":"123"}},  
        {$unwind : "$a"},  
        {$match : {"a.x":"/"}},  
        {$project : {_id : 0, z : "$a.z"}}
)

Das Ergebnis sieht so aus:

{ "result" : [ { "z" : "1000" } ], "ok" : 1 }