2014-04-23 28 views
9

Sto guardando la documentazione di MongoDB sulle proiezioni $ e $elemMatch . Sto cercando di capire come restituire solo un sottoinsieme dei campi di un array di proiezione , ma non riesco a capirlo.Restituisce solo campi specifici dal sottodocumento di array di proiezione

Related posts:

Dire che ho i seguenti documenti della collezione test:

{ 
    "_id": "A", 
    "array": [ 
     {"key": 1, "name": "foo", "data": {}}, 
     {"key": 2, "name": "bar", "data": {}} 
    ], 
    "extra": {} 
}, 
{ 
    "_id": "B", 
    "array": [ 
     {"key": 3, "name": "spam", "data": {}}, 
     {"key": 4, "name": "eggs", "data": {}} 
    ], 
    "extra": {} 
} 

La query che effettivamente voglio compiere è:

db.test.findOne({"array.key": 1}, {"array.$.name": 1, "extra": 1}) 

che uno si aspetterebbe che per restituire solo name sotto il sub-documento nell'array dove key era 1. Ad esempio,

{ 
    "_id": "A", 
    "array": [ 
     {"name": "foo"} 
    ], 
    "extra": {} 
} 

Ma se mi esibisco quella query, ottengo questo invece:

{ 
    "_id": "A", 
    "array": [ 
     {"key": 1, "name": "foo", "data": {}} 
    ], 
    "extra": {} 
} 

che è identico a fare la query:

db.test.findOne({"array.key": 1}, {"array.$": 1, "extra": 1}) 

Ho anche provato il seguente che risulta nello stesso:

db.test.findOne({"array.key": 1}, {"array.$": 1, "array.name": 1, "extra": 1}) 

Esiste un modo per restituire solo un sottoinsieme dei campi per array.$ anziché l'intero sotto-documento?

risposta

7

Stai specificatamente cercando di farlo senza utilizzare l'aggregato?

db.test.aggregate([{$unwind:"$array"}, 
        {$match:{"array.key":1}}, 
        {$project:{"array.name":1, extra:1}}]) 
+0

Non sapevo che l'aggregazione potesse realizzare ciò che stavo cercando di fare perché non sto aggregando più documenti. – cpburnz

+5

Ma cosa succede se non è possibile utilizzare gli aggregati? Sono un po 'confuso su questo, dato che puoi usare l'operatore $ e accedere a un sottocampo in un aggiornamento come questo: 'db.students.update ( {_id: 4," grades.grade ": 85}, {$ set: {"voti. $. std": 6}} ) ' – Bilk

Problemi correlati