2011-09-26 10 views
5

tengo antecedentes en mi colección y quiero ir a buscar los datos de la persona cuyo ID es 1. Pero estoy recibiendo los datos de 2times en lugar de 1.¿Cómo encontrar el registro coincidente en mongodb?

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

Entonces el correr

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

el resultado es:

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

pero necesito de la siguiente manera:

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

No entiendo dónde estoy cometiendo un error. Por favor necesita tu ayuda Estoy usando MongoDB, Java

Respuesta

0

person es una matriz. Si desea obtener el primer elemento de esta matriz se debe utilizar $slice

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

su mal. op no quiere el primer elemento, quiere recuperar el conjunto secundario correspondiente independientemente de la posición. si el sub documento de person.id está en la última posición arriba de la consulta no se perderá – RameshVel

+0

Tiene toda la razón. Quiero la matriz secundaria independientemente de su índice. Por favor, ayuda si tienes alguna solución am a newbee to mongodb – aswininayak

3

Este es el comportamiento de la filtración de documentos de múltiples niveles incrustado, normalmente el filtro coincidente volvería todo el documento, no los subconjuntos.

Normalmente se utiliza positional operator $ para hacer coincidir los documentos secundarios en updates. Pero la característica aún no se implementa en los especificadores de devolución.

Ya hay un problema pendiente en mongo Support for positional ($) operator in fields to return specifier. (Inicia sesión para votar si realmente se necesita la función)

Así que hay que redesgin su esquema para manejar esto, puede ser así

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}) 
Cuestiones relacionadas