我有一个名为“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
}}
])
答案 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
,因为您已经在测试至少该元素需要匹配。