MongoDB项目计数大于2的文档

时间:2015-11-12 07:59:24

标签: mongodb mongodb-query

我有一个像

这样的集合
{
    "_id": "201503110040020021",
    "Line": "1", // several documents may have this Line value
    "LineStart": ISODate("2015-03-11T06:49:35.000Z"),
    "SSCEXPEND": [{
            "Secuence": 10,
            "Title": 1,
        },
        {
            "Secuence": 183,
            "Title": 613,
        },
        ...
    ],

} {
    "_id": "201503110040020022",
    "Line": "1", // several documents may have this Line value
    "LineStart": ISODate("2015-03-11T06:49:35.000Z"),
    "SSCEXPEND": [{
            "Secuence": 10,
            "Title": 1,
        },

    ],

}

SSCEXPEND是一个数组。如果计数大于或等于2,我试图计算SSC数组和项目的大小。我的查询是这样的

db.entity.aggregate(
   [
      {
         $project: {
            SSCEXPEND_count: {$size: "$SSCEXPEND"}
         }
      },
      {
        $match: {
            "SSCEXPEND_count2": {$gte: ["$SSCEXPEND_count",2]}
         }
      }
   ]
)

我希望输出只是数组大小大于2的第一个文档。

项目部分工作正常,我可以获得计数,但我只需要计算那些计数大于或等于2但我的匹配部分不起作用。任何人都可以指导我哪里出错了吗?

2 个答案:

答案 0 :(得分:5)

您需要投影其他字段, $match 管道只需要对新创建的字段进行查询,以根据数组大小过滤文档。以下内容应该有效:

db.entity.aggregate([
    {
        "$project": {
            "Line": 1,
            "LineStart": 1, "SSCEXPEND": 1,
            "SSCEXPEND_count": { "$size": "$SSCEXPEND" }
         }
    },
    {
        "$match": {
            "SSCEXPEND_count": { "$gte": 2 }
         }
    }
])

示例输出

/* 0 */
{
    "result" : [ 
        {
            "_id" : "201503110040020021",
            "Line" : "1",
            "LineStart" : ISODate("2015-03-11T06:49:35.000Z"),
            "SSCEXPEND" : [ 
                {
                    "Secuence" : 10,
                    "Title" : 1
                }, 
                {
                    "Secuence" : 183,
                    "Title" : 613
                }
            ],
            "SSCEXPEND_count" : 2
        }
    ],
    "ok" : 1
}

答案 1 :(得分:5)

这实际上是一个非常简单的查询,其中的技巧是使用“点符号”属性来测试数组。您真正需要的是数据索引为2 $exists的文档,这意味着数组必须包含3个元素或更多元素:

db.entity.find({ "SSCEXPEND.2": { "$exists": true } })

这是最快的方法,甚至可以使用索引。无需在聚合操作中进行计算。