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")
                }
            ]
        }
    }