返回与父对象和子文档字段匹配的mongodb记录
存在mongodb查询返回多个文档的问题,这些文档的条件是父对象字段和子文档字段。有两条记录,此查询应仅返回其中一条记录。基本上,只有在类型为“已确认”且至少有一个警报子文档具有频率时,才返回整个文档。类型为“每日”且IsActive为true返回与父对象和子文档字段匹配的mongodb记录,mongodb,nosql,Mongodb,Nosql,存在mongodb查询返回多个文档的问题,这些文档的条件是父对象字段和子文档字段。有两条记录,此查询应仅返回其中一条记录。基本上,只有在类型为“已确认”且至少有一个警报子文档具有频率时,才返回整个文档。类型为“每日”且IsActive为true db.user.find({$and: [{Type:'confirmed'}, {"Alerts.Frequency.Type":'daily'}, {"Alerts.IsActive":true}]}) 这些是正在查询的mongodb记录 {
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}部分视为or。如果任何警报的类型为“daily”或IsActive,则为true。我需要这是一个和。我希望查询只返回第一个文档。您应该使用运算符:
db.user.find(
{ $and:
[
{ Type: 'local' },
{ Alerts: { $elemMatch: { 'Frequency.Type': 'daily', 'IsActive': true } }}
]
}
)
您的查询返回了2个文档,因为在第二个文档中,警报数组的第一个元素有
“IsActive”:true
,警报数组的第二个元素有“Frequency.Type”:“daily”
。如果要查找警报数组中元素同时具有这两个条件的文档(而不查找一个条件为一个元素的真值,另一个条件为另一个元素的真值的文档),则应使用$elemMatch
Ivan的解决方案。或者您可以省略$and运算符以使其更简单:
db.user.find(
{Type:"confirmed",
Alerts:{$elemMatch:{"Frequency.Type":"daily","IsActive":true}}
})