MongoDB different & where in same query?
Скажем, у меня есть следующие документы
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"]
Ответы
Ответ 1
Distinct
запрос в mongo с условием работает следующим образом
db.Article.distinct("Comment.Reply.ip",{"Comment.Reply.email" : "xxx"})
не наоборот
EDIT:
Теперь я понимаю проблему: для подписи/фильтрации поддокументов нам нужно использовать оператор $elemMatch, например
db.Article.distinct("Comment.Reply.ip",{Comment: {$elemMatch: {"Reply.email" : "xxx"}}})
но это не будет работать, если суб-документ содержит вспомогательные массивы (в вашем случае у вас есть массив ответов). Существует существующая проблема $elemMatch на subArray. И его планируется для монго 2.1. Вы можете проверить ссылку для получения дополнительной информации
Ответ 2
Возможно, вы можете попробовать это
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"
}
Ответ 3
distinctdates=db.dailyreport_detailed.find(
{'uid':personemail,'month':searchdate2,'year':searchdate1}
)
.distinct('date_only')
где find будет извлекаться в соответствии с условием, а в конце выдаются уникальные даты.