gpt4 book ai didi

MongoDB 聚合组数组到键 : sum value

转载 作者:行者123 更新时间:2023-12-02 15:32:27 24 4
gpt4 key购买 nike

您好,我是 mongodb 的新手,正在尝试将具有不同类型 (int) 的对象转换为键值对。

我有这样的收藏:

{
"_id" : ObjectId("5372a9fc0079285635db14d8"),
"type" : 1,
"stat" : "foobar"
},
{
"_id" : ObjectId("5372aa000079285635db14d9"),
"type" : 1,
"stat" : "foobar"
},
{
"_id" : ObjectId("5372aa010079285635db14da"),
"type" : 2,
"stat" : "foobar"
},{
"_id" : ObjectId("5372aa030079285635db14db"),
"type" : 3,
"stat" : "foobar"
}

我想得到这样的结果:

{
"type1" : 2, "type2" : 1, "type3" : 1,
"stat" : "foobar"
}

目前正在尝试聚合组,然后将类型值推送到数组

db.types.aggregate(
{$group : {
_id : "$stat",
types : {$push : "$type"}
}}
)

但不知道如何求和不同的类型,并把它转换成键值

/* 0 */
{
"result" : [
{
"_id" : "foobar",
"types" : [
1,
2,
2,
3
]
}
],
"ok" : 1
}

最佳答案

对于您的实际表单,因此假设您确实知道“类型”的可能值,那么您可以使用两个 $group 来完成此操作阶段和一些使用 $cond运算符(operator):

db.types.aggregate([
{ "$group": {
"_id": {
"stat": "$stat",
"type": "$type"
},
"count": { "$sum": 1 }
}},
{ "$group": {
"_id": "$_id.stat",
"type1": { "$sum": { "$cond": [
{ "$eq": [ "$_id.type", 1 ] },
"$count",
0
]}},
"type2": { "$sum": { "$cond": [
{ "$eq": [ "$_id.type", 2 ] },
"$count",
0
]}},
"type3": { "$sum": { "$cond": [
{ "$eq": [ "$_id.type", 3 ] },
"$count",
0
]}}
}}
])

这恰好给出了:

{ "_id" : "foobar", "type1" : 2, "type2" : 1, "type3" : 1 }

我实际上更喜欢带有两个 $group 的更动态的形式虽然阶段:

db.types.aggregate([
{ "$group": {
"_id": {
"stat": "$stat",
"type": "$type"
},
"count": { "$sum": 1 }
}},
{ "$group": {
"_id": "$_id.stat",
"types": { "$push": {
"type": "$_id.type",
"count": "$count"
}}
}}
])

不同的输出,但对值具有功能性和灵 active :

{
"_id" : "foobar",
"types" : [
{
"type" : 3,
"count" : 1
},
{
"type" : 2,
"count" : 1
},
{
"type" : 1,
"count" : 2
}
]
}

否则,如果您需要相同的输出格式但需要灵活的字段,那么您始终可以使用 mapReduce,但它的输出并不完全相同。

db.types.mapReduce(
function () {

var obj = { };

var key = "type" + this.type;
obj[key] = 1;

emit( this.stat, obj );

},
function (key,values) {

var obj = {};

values.forEach(function(value) {
for ( var k in value ) {
if ( !obj.hasOwnProperty(k) )
obj[k] = 0;
obj[k]++;
}
});

return obj;

},
{ "out": { "inline": 1 } }
)

在典型的 mapReduce 风格中:

   "results" : [
{
"_id" : "foobar",
"value" : {
"type1" : 2,
"type2" : 1,
"type3" : 1
}
}
],

但这些都是你的选择

关于MongoDB 聚合组数组到键 : sum value,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23643327/

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