如何使用MongoDB按数组的第一个元素进行分组?

Ale*_*lex 6 mongodb mongodb-query aggregation-framework

我开始学习MongoDB并使用这样的文档:

{
    "_id" : ObjectId("562fac8a4f9ecec40f5b8ff9"),
    "foo" : {
        "objectid" : "39",
        "stuff" : "65" 
    },
    "yearpublished" : [ 
        "1979"
    ],
    "bar": "1263"
}
Run Code Online (Sandbox Code Playgroud)

yearpublished是一个数组,我想按照这个数组中的第一个值对我的集合进行分组,然后计算相关文档的数量.

我已经做了这个查询:

db.foobar.aggregate(
   [
      {
        $group : {
           _id : '$yearpublished',
           count: { $sum: 1 }
        }
      }
   ]
)
Run Code Online (Sandbox Code Playgroud)

得到:

{
    "result" : [ 
        {
            "_id" : [ 
                "1923"
            ],
            "count" : 1.0000000000000000
        }, 
        {
            "_id" : [ 
                "1864"
            ],
            "count" : 1.0000000000000000
        }
}
Run Code Online (Sandbox Code Playgroud)

但我正在寻找这种结果(即仅第一个元素):

{
    "result" : [ 
        {
            "_id" : "1923,
            "count" : 1.0000000000000000
        }, 
        {
            "_id" : "1864",
            "count" : 1.0000000000000000
        }
}
Run Code Online (Sandbox Code Playgroud)

我试过_id : { $first: '$yearpublished.0' },_id : { $first: '$yearpublished[0]' },没试过 .

你知道我可以通过数组yearpublished的第一个元素进行分组吗?

Bla*_*ven 9

不幸的是,现在唯一的方法是$first在处理后从数组中提取元素$unwind.那么你当然要$group再次:

db.foobar.aggregate([
    { "$unwind": "$yearpublished" },
    { "$group": {
        "_id": "$_id",
        "yearpublished": { "$first": "$yearpublished" }
    }},
    { "$group": {
        "_id": "$yearpublished",
        "count": { "$sum": 1 }
    }}
])
Run Code Online (Sandbox Code Playgroud)

这是从阵列中获取"第一"元素的唯一当前方法,通过解构它并使用运算符来获取条目.

未来的版本将$arrayElemAt通过索引在一个阶段内完成:

db.foobar.aggregate([
    { "$group": {
        "_id": { "$arrayElemAt": [ "$yearpublished", 0 ] },
        "count": { "$sum": 1 }
    }}
])
Run Code Online (Sandbox Code Playgroud)

但是目前聚合框架并没有处理"点符号"索引的使用,例如标准的"投影"与.find()do,而不会,因此新的操作.