有一个mongodb查询问题返回到父对象字段和子文档字段上的条件的许多文档。有两个记录,这个查询应该只返回其中一个。如果类型已经确认,则基本上只返回整个文档'并且至少一个警报子文档具有Frequency.Type'每日'和IsActive是真的。
db.user.find({$and: [{Type:'confirmed'}, {"Alerts.Frequency.Type":'daily'}, {"Alerts.IsActive":true}]})
这些是被查询的mongodb记录
{
"Email" : "sung@domain.com",
"Type" : "confirmed",
"FName" : "Sung",
"Alerts" : [
{
"Keyword" : "sales",
"Frequency" : {
"Type" : "daily"
}
"IsActive" : true
}
]
}
{
"Email" : "sung2@domain.com",
"Type" : "confirmed",
"FName" : "Sung2",
"Alerts" : [
{
"Keyword" : "administrative",
"Frequency" : {
"Type" : "weekly"
}
"IsActive" : true
},
{
"Keyword" : "marketing",
"Frequency" : {
"Type" : "daily"
}
"IsActive" : false
}
]
}
它似乎正在处理{" Alerts.Frequency.Type":' daily'},{" Alerts.IsActive":true}查询的一部分作为或。如果有任何提醒,请每天输入一次'或IsActive是真的。我需要这个和。我希望查询只返回第一个文档。
答案 0 :(得分:1)
您应该使用elemMatch运算符:
db.user.find(
{ $and:
[
{ Type: 'local' },
{ Alerts: { $elemMatch: { 'Frequency.Type': 'daily', 'IsActive': true } }}
]
}
)
您的查询返回了2个文档,因为在第二个文档中,Alerts数组的第一个元素具有"IsActive": true
,而Alerts数组的第二个元素具有"Frequency.Type": 'daily'
。如果你想找到Alerts数组中的元素同时具有这两个条件的文档(并且找不到一个元素只有一个条件是真理而另一个元素是另一个元素的真实性的文档) - 你应该使用$elemMatch
。
答案 1 :(得分:1)
Ivan的解决方案将起作用。或者您可以省略$和运算符以使其更简单:
db.user.find(
{Type:"confirmed",
Alerts:{$elemMatch:{"Frequency.Type":"daily","IsActive":true}}
})