gpt4 book ai didi

mongodb - 如何根据数组元素的索引对文档进行分组?

转载 作者:可可西里 更新时间:2023-11-01 09:35:10 24 4
gpt4 key购买 nike

我正在寻找一种获取此类数据的方法

{ "_id" : 5, "count" : 1, "arr" : [ "aga", "dd", "a" ] },
{ "_id" : 6, "count" : 4, "arr" : [ "aga", "ysdf" ] },
{ "_id" : 7, "count" : 4, "arr" : [ "sad", "aga" ] }

我想根据 arr 的第一项(索引)对计数求和。在另一个聚合中,我想对 arr 数组中的第一个和第二个项目执行相同的操作。

我试过使用 unwind,但这会破坏数据,然后层次结构就会丢失。

我也试过用

$group: {
_id: {
arr_0:'$arr.0'
},
total:{
$sum: '$count'
}
}

但结果是空白数组

最佳答案

实际上你不能使用 dot notation按指定索引处的元素对文档进行分组。对于两个,您有两个选择:

首先使用 $arrayElemAt 的最佳方式MongoDB 3.2 中的新运算符。它返回数组中指定索引处的元素。

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

从 MongoDB 版本 3.0 开始,您将需要首先对数组进行反规范化 $group通过 _id 并使用 $first运算符返回数组中的第一项。从那里您将需要使用该值重新组合您的文档并使用 $sum 来获得总和。但这只适用于第一个和最后一个索引,因为 MongoDB 还提供了 $last运算符(operator)。

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

它会产生这样的东西:

{ "_id" : "sad", "count" : 1 }
{ "_id" : "aga", "count" : 2 }

要使用数组中 p 位置的元素进行分组,您将有更好的机会使用 mapReduce功能。

var mapFunction = function(){ emit(this.arr[0], 1); };
var reduceFunction = function(key, value) { return Array.sum(value); };
db.collection.mapReduce(mapFunction, reduceFunction, { "out": { "inline": 1 } } )

哪个返回:

{
"results" : [
{
"_id" : "aga",
"value" : 2
},
{
"_id" : "sad",
"value" : 1
}
],
"timeMillis" : 27,
"counts" : {
"input" : 3,
"emit" : 3,
"reduce" : 1,
"output" : 2
},
"ok" : 1
}

关于mongodb - 如何根据数组元素的索引对文档进行分组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36926563/

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