sql >> Database >  >> NoSQL >> MongoDB

Een enkele eigenschap ophalen uit document

In MongoDB 2.0 en ouder is dit niet mogelijk. Wat u wilt doen, is een specifiek element van de array retourneren - maar dat is niet wat uw projectie feitelijk doet, het retourneert gewoon de hele array en vervolgens het z-element van elk.

Met 2.2 (rc2 vanaf het schrijven van dit antwoord) is het echter een beetje beter geworden. U kunt nu $elemMatch gebruiken als onderdeel van je projectie (zie SERVER-2238 voor details), zodat u alleen het vereiste array-element terugtrekt. Dus probeer zoiets als dit:

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

Of gebruik gewoon $elemMatch in de projectie zelf, waarvan u misschien denkt dat het schoner is:

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

Dus nu is tenminste de geretourneerde array alleen degene die alleen de gewenste items bevat en je kunt eenvoudig verwijzen naar het relevante z-element (elemMatch-projecties op een subdocument worden nog niet ondersteund).

Last but not least hebben we in 2.2 het aggregatieraamwerk, en een van de dingen die het kan doen (met het $project operator, is om uw documenten opnieuw vorm te geven en subdocumenten en array-elementen te veranderen in arrays op het hoogste niveau. Om het gewenste resultaat te krijgen, zou je zoiets als dit doen:

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

Het resultaat ziet er als volgt uit:

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



  1. Vijf tips voor betere MongoDB-hosting op Azure

  2. Bestandsschrijfbewerkingen in mongo-script?

  3. mongodb 4x langzamer dan sqlite, 2x langzamer dan csv?

  4. Het authenticatiemechanisme SCRAM-SHA-1 wordt niet ondersteund