2011-09-26 18 views
5

Ho un record nella mia collezione e voglio recuperare i dati della persona il cui ID è 1. Ma io sono sempre i dettagli per 2times invece di 1.Come trovare il record corrispondente in mongodb?

db.mycollection.insert({"person" : [ { "id":1, "details" : { "name" : "Aswini", "Age" : 10 }}, { "id":2, "details" : { "name" : "Mahesh", "Age" : 11}}]}) 

Poi esecuzione

> db.mycollection.findOne({"person.id":1},{"person.details":1,"_id":0}) 

il risultato è:

{ 
     "person" : 
       [ 
        { 
         "details" : 
         { 
         "name" : "Aswini", 
         "Age" : 10 
         } 
        }, 
        { 
         "details" : 
         { 
         "name" : "Mahesh", 
         "Age" : 11 
         } 
        } 
       ] 
    } 

ma ho bisogno come segue:

{ 
    "person" : [ 
       { 
       "details" : { 
          "name" : "Aswini", 
          "Age" : 10 
         } 
       } 
      ] 
    } 

Non capisco dove sto sbagliando. Per favore, hai bisogno del tuo aiuto. Sto usando MongoDB, Java

risposta

0

person è un array. Se si desidera ottenere primo elemento di questo array è necessario utilizzare $slice

db.mycollection.findOne({"person.id":1},{"person":{$slice:[0,1]},"_id":0}) 
+0

suo male. op non vuole il primo elemento, vuole recuperare il sub array corrispondente indipendentemente dalla posizione. se il sottodocumento person.id si trova nell'ultima posizione sopra la query, non lo sarà. – RameshVel

+0

Hai assolutamente ragione. Voglio il sotto-array indipendentemente dal suo indice. Si prega di aiutare se avete qualche soluzione sono un newbee a mongodb – aswininayak

3

Questo è il comportamento di filtraggio a più livelli integrata dei documenti, normalmente il filtro corrispondente sarebbe tornato l'intero documento, non i sottoinsiemi.

Solitamente positional operator $ utilizzato per abbinare i documenti secondari in updates. Ma la funzione non è ancora implementata negli identificatori di ritorno.

C'è già un problema in sospeso in mongo Support for positional ($) operator in fields to return specifier. (Si prega di accedere per votare se veramente avete bisogno della funzione)

quindi bisogna redesgin lo schema a gestire questa situazione, potrebbe essere simile a questo

db.test.insert({"person" : [ { "id":1, "details" : { "name" : "Aswini", "Age" : 10 }}]}) 
db.test.insert({"person" : [ { "id":2, "details" : { "name" : "Mahesh", "Age" : 11}}]}) 

db.test.find({"person.id":1},{'person.details':1}) 
Problemi correlati