Mongodb Mongo-选择没有特定键值对的文档
这是集合中的示例文档Mongodb Mongo-选择没有特定键值对的文档,mongodb,mongodb-query,Mongodb,Mongodb Query,这是集合中的示例文档 集合由多个文档组成,如下面的文档,在“genericParams”中包含可变数组元素 我想获取所有“密钥”不等于“手动退款处理”的文档。 同时,我需要“genericParms”数组的所有元素,这就是为什么我没有使用$unwind。 我试过的- “currentState.genericParams.key”:{$exists:true,$ne:manual\u return\u processed”} “currentState.genericParams.key”:{$
集合由多个文档组成,如下面的文档,在“genericParams”中包含可变数组元素 我想获取所有“密钥”不等于“手动退款处理”的文档。
同时,我需要“genericParms”数组的所有元素,这就是为什么我没有使用
$unwind
。
我试过的-
“currentState.genericParams.key”:{$exists:true,$ne:manual\u return\u processed”}
“currentState.genericParams.key”:{$exists:true,$nin:[“手动退款”]}
这段代码将给出准确的结果。假设您的数据存储在名为stateso的集合中
db.state.aggregate([
{$unwind:"$currentState.genericParams"},
{$match:{"currentState.genericParams.key":{$ne:"manual_refund_processed"}}},
{$group:{_id:"$_id", genericParams:{$push:"$currentState.genericParams"}}},
{$project:{_id:0, currentState: { genericParams:"$genericParams"}}}
]).pretty()
或
输出为:
{
"currentState" : {
"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")
}
]
}
}
这段代码将给出准确的结果。假设您的数据存储在名为stateso的集合中
db.state.aggregate([
{$unwind:"$currentState.genericParams"},
{$match:{"currentState.genericParams.key":{$ne:"manual_refund_processed"}}},
{$group:{_id:"$_id", genericParams:{$push:"$currentState.genericParams"}}},
{$project:{_id:0, currentState: { genericParams:"$genericParams"}}}
]).pretty()
或
输出为:
{
"currentState" : {
"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")
}
]
}
}
那么问题是什么呢?示例文档将不会返回,因为该值存在,这正是您所要求的。您希望的是文档,而不是特定的数组条目吗?您希望得到什么?我希望得到所有没有特定数组项的文档。然后可以使用展开?您认为这与
$Unwind
有什么关系?你认为文件是什么?您的示例只有一个“文档”。数组条目中有“子文档”。这就是我问你的,这就是你的意思。“.document,但不是那个特定的数组条目?”集合由多个文档组成,如上面的文档,在“genericParams”中有变量数组元素。实际上不是。我猜想您的意思是返回每个文档的数组,而不是返回包含所请求的键的数组元素。这就是给出的答案(如果没有很好的解释的话)所做的,但是如果这就是你的意思的话,你的措辞就不是很清楚了。当然,首选项是$filter
,只要您有MongoDB 3.2可用。或$map
和$setDifference
甚至$redact
用于MongoDB 2.6或更高版本(最有可能)。通常尽可能远离$unwind
,因为它会带来开销(即每个数组条目的文档副本),那么问题是什么?示例文档将不会返回,因为该值存在,这正是您所要求的。您希望的是文档,而不是特定的数组条目吗?您希望得到什么?我希望得到所有没有特定数组项的文档。然后可以使用展开?您认为这与$Unwind
有什么关系?你认为文件是什么?您的示例只有一个“文档”。数组条目中有“子文档”。这就是我问你的,这就是你的意思。“.document,但不是那个特定的数组条目?”集合由多个文档组成,如上面的文档,在“genericParams”中有变量数组元素。实际上不是。我猜想您的意思是返回每个文档的数组,而不是返回包含所请求的键的数组元素。这就是给出的答案(如果没有很好的解释的话)所做的,但是如果这就是你的意思的话,你的措辞就不是很清楚了。当然,首选项是$filter
,只要您有MongoDB 3.2可用。或$map
和$setDifference
甚至$redact
用于MongoDB 2.6或更高版本(最有可能)。通常在可能的情况下尽量远离$unwind
,因为它引入了开销(即每个数组条目的文档副本),可能是OP所要求的,但此处选择数组的语法并不正确,并且在演示中也缺少完整聚合语句的上下文。可能是OP所要求的,但这里选择数组的语法并不正确,而且在演示中也缺少完整聚合语句的上下文。
{
"currentState" : {
"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")
}
]
}
}