2015-05-05 11 views
5

Data una collezione come questa: ..MongoDB: Come trovare un documento da un ID all'interno di un documento nidificato

[ 
    { 
    "_id" : ObjectId("5546329a470000850084a621"), 
    "name": "Joe", 
    "surname": "Smith", 
    "accounts": [ 
     { 
     "_id" : ObjectId("5546329a470000850084a655"), 
     "default": true, 
     "status" : "approved", 
     "activationTime" : ISODate("2013-05-03T14:37:15.025Z") 
     }, 
     { 
     "_id" : ObjectId("5546329a470000850084a688"), 
     "default": true, 
     "status" : "approved", 
     "activationTime" : ISODate("2014-06-03T14:37:15.025Z") 
     } 
    ] 
    }, 
    { 
    "_id" : ObjectId("9546329a470079850084a622"), 
    "name": "Jimmy", 
    "surname": "Brown", 
    "accounts": [ 
     { 
     "_id" : ObjectId("5546329a470790850084a651"), 
     "default": true, 
     "status" : "suspended", 
     "activationTime" : ISODate("2015-02-03T14:37:15.025Z") 
     }, 
     { 
     "_id" : ObjectId("5546329a470019850084a611"), 
     "default": true, 
     "status" : "approved", 
     "activationTime" : ISODate("2015-04-03T14:37:15.025Z") 
     } 
    ] 
    }, 
] 

... come faccio a trovare un documento da accounts.N._id? Ho provato questo ...

db.users.find(
    {}, 
    { 
    "accounts": 0, "accounts": { 
     "$elemMatch": { "_id" : ObjectId("5546329a470019850084a611"), "default": true } 
    } 
    } 
) 

... ma does't lavoro da quando ho solo il _id di tutti i documenti:

{ "_id" : ObjectId("5546329a470000850084a621") } 
{ "_id" : ObjectId("9546329a470079850084a622") } 

Mi sto perdendo qualcosa?

EDIT

Il risultato che ho effettivamente bisogno è qualcosa di simile:

{ 
    "_id" : ObjectId("9546329a470079850084a622"), 
    "name": "Jimmy", 
    "surname": "Brown" 
} 

Per esempio, ho bisogno di trovare da accounts.N._id ma senza mostrare il documento nidificato in sé.

risposta

9

Uso dot notation:

Quando il campo contiene un documento incorporato, una query può specificare una corrispondenza esatta sul documento incorporato o specificare un match da singoli campi nel documento incorporato usando la notazione dot .

db.coll.find({ 
    "accounts._id" :ObjectId("5546329a470019850084a611") 
}) 

Se avete bisogno di uscita solo la parte di un array in cui avete il vostro _id è necessario utilizzare dollar in projection

Il $ operatore posizionale limita il contenuto di un dai risultati della query per contenere solo il primo elemento corrispondente al documento della query .

e la query sarà simile:

db.coll.find({ 
    "accounts._id" :ObjectId("5546329a470019850084a611") 
}, { 
    "accounts.$.": 1 
}) 

P.S. se è necessario l'output come nelle vostre domande modificate, utilizzare questo:

db.coll.find({ 
    "accounts._id" :ObjectId("5546329a470019850084a611") 
}, { 
    accounts : 0 
}) 
+0

ringrazio molto ... Io non voglio mostrare il documento nidificato ... vedi il mio post aggiornato. – j3d

+0

@ j3d vedere la mia risposta aggiornata –

1

Usa $elemMatch a criteri e utilizzare $ operatore posizionale nel progetto come di seguito:

db.users.find({ 
    "accounts": { 
    "$elemMatch": { 
     "_id": ObjectId("5546329a470019850084a611"), 
     "default": true 
    } 
    } 
}, { 
    "accounts.$._id": 1 // "accounts.$": 1 also works 
}).pretty() 
4

L'operatore $ elemMatch limita il contenuto di un campo dai risultati della query per contenere solo il primo elemento che corrisponde alla condizione $ elemMatch.

Nel tuo caso:

db.users.find({'_id': ObjectId('5546329a470000850084a621')}, {accounts: {$elemMatch: {_id: ObjectId('5546329a470000850084a655')}}}) 

consultare: Mongo Docs

+0

in che modo è diversa dalle risposte fornite 10 minuti prima di questa? –

+0

Include esempio con descrizione e collegamenti a quella pagina e glossario. Quindi, quella persona che ha posto questa domanda può vedere altre terminologie di MongoDB. –

+0

che sono disponibili anche nelle risposte –

Problemi correlati