sql >> Databáze >  >> NoSQL >> MongoDB

Načíst jednu vlastnost z dokumentu

V MongoDB 2.0 a starších to není možné. Co chcete udělat, je vrátit konkrétní prvek pole – ale to není to, co vaše projekce ve skutečnosti dělá, vrátí pouze celé pole a poté prvek z každého z nich.

Nicméně s 2.2 (rc2 v době psaní této odpovědi) se věci trochu zlepšily. Nyní můžete používat $elemMatch jako součást vaší projekce (viz SERVER-2238 podrobnosti), takže vytáhnete zpět pouze požadovaný prvek pole. Takže zkuste něco takového:

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

Nebo jednoduše použijte $elemMatch v samotné projekci, o které si možná myslíte, že je čistší:

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

Nyní tedy alespoň vrácené pole je pouze pole obsahující pouze položky, které chcete, a můžete jednoduše odkazovat na příslušný prvek z (projekce elemMatch na vnořeném dokumentu zatím nejsou podporovány).

V neposlední řadě máme ve verzi 2.2 agregační rámec a jednu z věcí, které umí (s $project je přetvořit vaše dokumenty a změnit dílčí dokumenty a prvky pole na pole nejvyšší úrovně. Chcete-li dosáhnout požadovaného výsledku, udělali byste něco takového:

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

Výsledek vypadá takto:

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



  1. Geoprostorová podpora v MongoDB

  2. Zjistěte, zda někdo měl narozeniny v příštích 30 dnech s mongo

  3. MongoDB $objectToArray

  4. Vrátí skutečný typ pole v MongoDB