mongoDB отличается & где в том же запросе? - PullRequest
45 голосов
/ 14 сентября 2011

Допустим, у меня есть следующие документы

Article { Comment: embedMany }

Comment { Reply: embedMany }

Reply { email: string, ip: string }

Я хочу сделать запрос, который выбирает различные Reply.ip, где Reply.email = xxx

Что-то вроде этого, только это не такработа ..

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

Экспорт 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"
            }
         ]
      }
   ]
}

Я запускаю : db.Article.distinct("Comment.Reply.ip",{"Comment.Reply.email" : "xxx"})

Я ожидаю : ["128.168.1.1", "192.168.1.1"]

Я получаю : ["127.0.0.1", "128.168.1.1", "192.168.1.1", "192.168.2.1"]

Ответы [ 3 ]

55 голосов
/ 15 сентября 2011

Distinct запрос в монго с условием работает следующим образом

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

не наоборот

РЕДАКТИРОВАТЬ:

Я понимаюпроблема теперь, чтобы соответствовать / фильтровать вложенные документы, нам нужно использовать оператор $ elemMatch, например

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

, но это не будет работать, если вложенный документ содержит вложенные массивы (в вашем случае у вас есть массивответы).Существует существующая проблема $ elemMatch в subArray .И это планируется для Монго 2.1.Вы можете проверить ссылку для получения дополнительной информации

1 голос
/ 11 августа 2016

Может быть, вы могли бы попробовать это

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

Результат примера должен быть

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

/* 2 */
{
    "_id" : "128.168.1.1"
}
0 голосов
/ 22 сентября 2018
distinctdates=db.dailyreport_detailed.find(

{'uid':personemail,'month':searchdate2,'year':searchdate1}
)

.distinct('date_only')

, где find будет извлекаться в соответствии с условием, а отличное в конце даст уникальные даты.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...