gpt4 book ai didi

mongodb - 如何按数组的第一个元素分组?

转载 作者:IT老高 更新时间:2023-10-28 13:26:07 30 4
gpt4 key购买 nike

我使用的文档如下:

{
"foo" : { "objectid" : "39", "stuff" : "65" },
"yearpublished" : ["1979"],
"bar" : "1263"
}

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

我已经写了这个查询:

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

然后得到:

{
"result" : [
{ "_id" : ["1923"], "count" : 1.0000000000000000 },
{ "_id" : ["1864"], "count" : 1.0000000000000000 }
]
}

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

{
"result" : [
{ "_id" : "1923", "count" : 1.0000000000000000 },
{ "_id" : "1864", "count" : 1.0000000000000000 }
]
}

我也试过 _id : { $first: '$yearpublished.0' },_id : { $first: '$yearpublished[0]' },没有成功。

如何按数组 yearpublished 的第一个元素进行分组?

最佳答案

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

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

这是从数组中获取“第一个”元素的唯一当前方法,通过解构它并使用运算符获取条目。

future 版本将有 $arrayElemAt 可以在单个阶段内通过索引完成此操作:

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

但目前聚合框架不处理“点表示法”索引的使用,例如带有 .find() 的标准“投影”会,也不会,因此新的操作。

关于mongodb - 如何按数组的第一个元素分组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33388558/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com