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
),因为您已经在测试至少该元素需要匹配