选择具有特定键值对但没有其他键值对的文档

时间:2016-02-06 07:30:36

标签: json mongodb mongodb-query aggregation-framework

我有一个名为“collection”的集合 它有2个文件如下所示 -
文件A

 {
                "genericParams" : [
                    {
                        "key" : "sms_email_count",
                        "value" : 3
                    },
                    {
                        "key" : "first_sms_email_time",
                        "value" : NumberLong("1450691202568")
                    },
                    {
                        "key" : "second_sms_email_time",
                        "value" : NumberLong("1450691202568")
                    },
                    {
                        "key" : "third_sms_email_time",
                        "value" : NumberLong("1450691202568")
                    },
                    {
                        "key" : "manual_refund_processed",
                        "value" : "false"
                    }
                ]
            }

文件B

 {
                "genericParams" : [
                    {
                        "key" : "sms_email_count",
                        "value" : 3
                    },
                    {
                        "key" : "first_sms_email_time",
                        "value" : NumberLong("1450691202568")
                    },
                    {
                        "key" : "second_sms_email_time",
                        "value" : NumberLong("1450691202568")
                    },
                    {
                        "key" : "third_sms_email_time",
                        "value" : NumberLong("1450691202568")
                    }
                ]
            }

我想进行查询,以便仅输出 文件B
此查询的逻辑是我希望文档具有键值对"key" : "third_sms_email_time"但不是"key" : "manual_refund_processed"
这里的文件是指A / B号文件。 :)

 {
                "genericParams" : [
                    {
                        "key" : "sms_email_count",
                        "value" : 3
                    },
                    {
                        "key" : "first_sms_email_time",
                        "value" : NumberLong("1450691202568")
                    },
                    {
                        "key" : "second_sms_email_time",
                        "value" : NumberLong("1450691202568")
                    },
                    {
                        "key" : "third_sms_email_time",
                        "value" : NumberLong("1450691202568")
                    }
                ]
            }

我尝试了什么 -

db.collection.aggregate([
    {$match: { "genericParams.key": { $exists: true, $nin: [ "manual_refund_processed" ] }, "currentState.genericParams.key": "third_sms_email_time"   }},
    { $project : {
        "genericParams" : 1 
    }}  
])

1 个答案:

答案 0 :(得分:3)

您的查询尝试使用相同的"键"两次。你不能在一个对象结构中这样做,因为你本质上是"越过"同一个键的值。因此,所考虑的实际查询仅为" second"该密钥的条件。

因此,如果您想为同一个密钥设置多个条件,请使用$and运算符:

db.collection.aggregate([
    { "$match": {
        "$and": [
            { "genericParams.key": { "$exists": true, "$ne": "manual_funds_processed" } },
            { "genericParams.key": "third_sms_email_time" }
        ] 
    },
    // other stages
})

或者因为所有MongoDB条件都是真的"和"默认情况下,您也可以在这种情况下指定$eq

db.collection.aggregate([
    { "$match": {
        "genericParams.key": { 
            "$ne": "manual_refund_processed", 
            "$eq": "third_sms_email_time"
        }
    }},
    // other stages
])

在此注意到.aggregate()本身并没有什么特别之处,因为它只是基础"查询"正在做文件选择工作的部分。

另请注意,使用"肯定"条件存在($eq)没有必要使用$exists,因为您已经在测试至少该元素需要匹配。