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

Json 选择具有特定键值对但不具有其他键值对的文档,json,mongodb,mongodb-query,aggregation-framework,Json,Mongodb,Mongodb Query,Aggregation Framework,我有一个名为“收藏”的收藏。 它有两个文档,如下所示- 文件A { "genericParams" : [ { "key" : "sms_email_count", "value" : 3 }, { "

我有一个名为“收藏”的收藏。
它有两个文档,如下所示-
文件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"
                    }
                ]
            }
 {
                "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

 {
                "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"
                    }
                ]
            }
 {
                "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\u sms\u email\u time”
,而不是
“key”:“manual\u return\u processed”

这里的单据是指单据A/B:)

我试过的-

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

您的查询尝试使用相同的“键”两次。在对象结构中不能这样做,因为本质上是对同一个键的值“过度加载”。因此,所考虑的实际查询只是该键的“第二个”条件

因此,如果您希望对同一个键具有多个条件,请使用运算符:

db.collection.aggregate([
    { "$match": {
        "$and": [
            { "genericParams.key": { "$exists": true, "$ne": "manual_funds_processed" } },
            { "genericParams.key": "third_sms_email_time" }
        ] 
    },
    // other stages
})
或者,由于默认情况下所有MongoDB条件实际上都是“and”参数,因此您也可以在本例中指定:

db.collection.aggregate([
    { "$match": {
        "genericParams.key": { 
            "$ne": "manual_refund_processed", 
            "$eq": "third_sms_email_time"
        }
    }},
    // other stages
])
这里需要注意的是,
.aggregate()
本身没有什么特别之处,因为它只是执行文档选择工作的基本“查询”部分

还请注意,如果存在“正”条件(即
$eq
),则实际上不需要使用
$exists
),因为您已经在测试至少该元素需要匹配