2011-09-14 21 views
26

Digamos que tengo los siguientes documentosmongoDB distinct y ¿en la misma consulta?

Article { Comment: embedMany } 

Comment { Reply: embedMany } 

Reply { email: string, ip: string } 

Quiero hacer una consulta que selecciona distinta Reply.ip donde Reply.email = xxx

Algo como esto, sólo que no funciona ..

db.Article.find("Comment.Reply.email" : "xxx").distinct("Comment.Reply.ip") 

JSON export:

{ 
    "_id":{ 
     "$oid":"4e71be36c6eed629c61cea2c" 
    }, 
    "name":"test", 
    "Comment":[ 
     { 
     "name":"comment test", 
     "Reply":[ 
      { 
       "ip":"192.168.2.1", 
       "email":"yyy" 
      }, 
      { 
       "ip":"127.0.0.1", 
       "email":"zzz" 
      } 
     ] 
     }, 
     { 
     "name":"comment 2 test", 
     "Reply":[ 
      { 
       "ip":"128.168.1.1", 
       "email":"xxx" 
      }, 
      { 
       "ip":"192.168.1.1", 
       "email":"xxx" 
      } 
     ] 
     } 
    ] 
} 

corro: db.Article.distinct("Comment.Reply.ip",{"Comment.Reply.email" : "xxx"})

espero: ["128.168.1.1", "192.168.1.1"]

me sale: ["127.0.0.1", "128.168.1.1", "192.168.1.1", "192.168.2.1"]

+3

tener mi upvote para el "corro", "espero "," Obtengo ", ¡si todas las preguntas tuvieran el formato de esta manera! – adelriosantiago

+1

Aquí hay una variante de la solución http://stackoverflow.com/a/13864518/358013 – blueskin

Respuesta

36

Distinct consulta en mongo con la condición funciona de la siguiente

db.Article.distinct("Comment.Reply.ip",{"Comment.Reply.email" : "xxx"}) 

no revés

EDIT:

entiendo el problema ahora, a finde para que coincida con subdocumentos/filtro que tenemos que utilizar $ operador elemMatch, como este

db.Article.distinct("Comment.Reply.ip",{Comment: {$elemMatch: {"Reply.email" : "xxx"}}}) 

pero esto no funcionará si el sub-documento contiene sub-arrays (en su caso, tiene una matriz de respuestas). Hay un problema existente $elemMatch on subArray está abierto. Y está planeado para mongo 2.1. Se puede extraer el enlace para más información

+0

Lo probé y parece ignorar la condición, por lo que los resultados son los mismos que db.Article.distinct ("Comment.Reply.ip ") – Inoryy

+0

@Inori, el código anterior funciona perfectamente bien en mi entorno ... ¿puedes publicar tus datos reales y el resultado que obtuviste para poder cavar en ... – RameshVel

+0

por favor revisa la actualización en la primera publicación – Inoryy

0

Tal vez usted podría intentar este

db.Article.aggregate([ 
{$unwind: "$Comment"}, 
{$unwind: "$Comment.Reply"}, 
{$match: {"Comment.Reply.email": "xxx"}}, 
{$group: {_id: "$Comment.Reply.ip"}} 
]) 

El resultado del ejemplo debe ser

/* 1 */ 
{ 
    "_id" : "192.168.1.1" 
} 

/* 2 */ 
{ 
    "_id" : "128.168.1.1" 
} 
Cuestiones relacionadas