如何在Mongo中按键名查询嵌入式数组?

时间:2017-05-13 03:41:46

标签: mongodb mongodb-query

我的文档看起来像这样(例如用途)。

{
    "_id" : ObjectId("591675e89a89201e4d520c89"),
    "raw_data_history" : {
        "APR-2017" : [ 
            {
                "count" : "540421",
                "reason" : "blah blah",
            },
            {
                "count" : "111111",
                "reason" : "blah blah 2",
            }
        ],
 "MAY-2017" : [ 
            {
                "count" : "13",
                "reason" : "blah blah",
            },
            {
                "count" : "100",
                "reason" : "blah blah 2",
            }
        ],
    },
    "review" : false,
    "active" : true,

}

我想获得APR-2017拥有1个以上数组元素内容的集合中的所有文档。我尝试过以下方法:

db.getCollection('collections').find( {raw_data_history.APR-2017 : {$exists:true}, $where:'this.raw_data_history.APR-2017.length>1'} )

但我得到

Error: Line 1: Unexpected token .

我该怎么做?

2 个答案:

答案 0 :(得分:1)

在聚合中使用$size运算符。如果你想在没有聚合的情况下进行,你需要有一个字段来存储数组的大小。 $size documentation

db.collections.aggregate( {$project : {numberOfElements : {$size : "$raw_data_history.APR-2017"}, doc : "$$ROOT"}}, {$match : {numberOfElements : {$gt : 1}}} )

编辑:稍微澄清一下:

  • $ project stage将投影数组的大小以及完整文档。它实际上就像添加一个字段来跟踪文档的数组大小。
  • $ match stage只是过滤文档,因此它只会在APR-2017中返回包含多个数组的文档

答案 1 :(得分:1)

如果要在对象内使用字段,则必须将该字段名称用引号(“”)传递。

以下查询工作符合您的要求。

db.getCollection('collections')。find({“raw_data_history.APR-2017.1”:{$ exists:true}})

将raw_data_history.APR-2017.1放在双引号中。