it-swarm.it

mongoDB distinto e dove nella stessa query?

Diciamo che ho i seguenti documenti

Article { Comment: embedMany }

Comment { Reply: embedMany }

Reply { email: string, ip: string }

Voglio fare una query che seleziona Reply.ip distinto dove Reply.email = xxx

Qualcosa di simile, solo che non funziona ..

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

Esportazione JSON:  

{
   "_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"})

Mi aspetto : ["128.168.1.1", "192.168.1.1"]

Ottengo : ["127.0.0.1", "128.168.1.1", "192.168.1.1", "192.168.2.1"]

40
Inoryy

La query Distinct in mongo con condizioni funziona in questo modo

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

non in altro modo

MODIFICARE: 

Ora capisco il problema, inorder per abbinare/filtrare i documenti secondari che dobbiamo usare l'operatore $ elemMatch, come questo 

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

ma questo non funzionerà se il sub-documento contiene sotto-array (nel tuo caso, hai una serie di risposte). C'è un problema esistente $ elemMatch su subArray è aperto. E è in programma per mongo 2.1. Puoi controllare il link per maggiori informazioni

52
RameshVel

Forse potresti provare questo

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

Il risultato dell'esempio dovrebbe essere

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

/* 2 */
{
    "_id" : "128.168.1.1"
}
1
Kaim

distinctdates = db.dailyreport_detailed.find (

{ 'Uid': personemail, 'mese': searchdate2, 'l'anno': searchdate1}. .__)

.distinct ( 'date_only')

dove trovare recupererà secondo condizione e distinto alla fine darà date uniche.

0
Abilash Raghu