匹配名称中包含$的字段属性

时间:2016-04-21 20:04:51

标签: mongodb mongodb-query aggregation-framework

我将很多聚合管道保存到一个集合中:

   {
        "_id" : ObjectId("56d06614070b7f2b117b23db"),
        "ops" : [
            {
                "$unwind" : "$x"
            },
            {
                "$unwind" : "$y"
            },
            {
                "$match" : {
                    "brand" : "z"
                }
            }
        ]
    }

我想对这些数据做一些统计:

db.apicalls.aggregate([{"$unwind":"$ops"},{"$match":{***...***}}])

单独展开操作的结果如下:

{ "_id" : ObjectId("56d06631070b7f11117b23d4"), "ops" : { "$match" : { "brand" : "zzz" } } },
{ "_id" : ObjectId("56d06631070b7f11117b23d4"), "ops" : { "$unwind" : "$x" } }

我希望只能匹配保存到集合中的$ match操作。 有人有如何选择键#34; $ match" ?

由于

1 个答案:

答案 0 :(得分:1)

您的问题具有误导性。由于$字符作为MongoDB文档中的属性名称是“非法”的,因此它们实际上将被“转义”为“斜杠”\

{
    "_id" : ObjectId("56d06614070b7f2b117b23db"),
    "ops" : [
        {
            "\$unwind" : "$x"
        },
        {
            "\$unwind" : "$y"
        },
        {
            "\$match" : {
                    "brand" : "z"
            }
        }
    ]
}

因此,您需要在关键字中包含所有字符,以便使用$exists运算符查找\$match

db.apicalls.aggregate([
  { "$unwind": "$ops" },
  { "$match": {
    "ops.\\$match": { "$exists": true }
  }}
])

返回正确的文档:

{ "_id" : ObjectId("56d06614070b7f2b117b23db"), "ops" : { "\$match" : { "brand" : "z" } } }