返回与父对象和子文档字段匹配的mongodb记录

返回与父对象和子文档字段匹配的mongodb记录,mongodb,nosql,Mongodb,Nosql,存在mongodb查询返回多个文档的问题,这些文档的条件是父对象字段和子文档字段。有两条记录,此查询应仅返回其中一条记录。基本上,只有在类型为“已确认”且至少有一个警报子文档具有频率时,才返回整个文档。类型为“每日”且IsActive为true db.user.find({$and: [{Type:'confirmed'}, {"Alerts.Frequency.Type":'daily'}, {"Alerts.IsActive":true}]}) 这些是正在查询的mongodb记录 {

存在mongodb查询返回多个文档的问题,这些文档的条件是父对象字段和子文档字段。有两条记录,此查询应仅返回其中一条记录。基本上,只有在类型为“已确认”且至少有一个警报子文档具有频率时,才返回整个文档。类型为“每日”且IsActive为true

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}}
})