日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

mongodb 分组聚合_MongoDB按键值对进行聚合/分组

發布時間:2025/3/20 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 mongodb 分组聚合_MongoDB按键值对进行聚合/分组 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

我的數據看起來像這樣:

{

"_id" : "9aa072e4-b706-47e6-9607-1a39e904a05a",

"customerId" : "2164289-4",

"channelStatuses" : {

"FOO" : {

"status" : "done"

},

"BAR" : {

"status" : "error"

}

},

"channel" : "BAR",

}

我的聚合/組看起來像這樣:

{

"_id" : {

"customerId" : "$customerId",

"channel" : "$channel",

"status" : "$channelStatuses[$channel].status"

},

"count" : {

"$sum" : 1

}

}

所以基本上通過示例數據,該組應該給我一個分組的組:

{"customerId": "2164289-4", "channel": "BAR", "status": "error"}

但是我不能在聚合/組中使用[] -indexing.我該怎么做呢?

最佳答案 使用.aggregate()無法獲得當前結構所需的結果.您“可以”更改結構以使用數組而不是命名鍵,操作實際上非常簡單.

所以有一個文件,如:

{

"_id" : "9aa072e4-b706-47e6-9607-1a39e904a05a",

"customerId" : "2164289-4",

"channelStatuses" : [

{

"channel": "FOO",

"status" : "done"

},

{

"channel": "BAR",

"status" : "error"

}

],

"channel" : "BAR",

}

{ "$group": {

"_id": {

"customerId" : "$customerId",

"channel" : "$channel",

"status": {

"$arrayElemAt": [

{ "$map": {

"input": { "$filter": {

"input": "$chanelStatuses",

"as": "el",

"cond": { "$eq": [ "$$el.channel", "$channel" ] }

}},

"as": "el",

"in": "$$el.status"

}},

0

]

}

},

"count": { "$sum": 1 }

}}

較早版本的MongoDB將需要$unwind來訪問匹配的數組元素.

在MongoDB 2.6中,您仍然可以在展開之前“預過濾”數組:

[

{ "$project": {

"customerId": 1,

"channel": 1,

"status": {

"$setDifference": [

{ "$map": {

"input": "$channelStatuses",

"as": "el",

"in": {

"$cond": [

{ "$eq": [ "$$el.channel", "$channel" ] },

"$$el.status",

false

]

}

}},

[false]

]

}

}},

{ "$unwind": "$status" },

{ "$group": {

"_id": {

"customerId": "$customerId",

"channel": "$channel",

"status": "$status"

},

"count": { "$sum": 1 }

}}

]

之前的任何事情你都會在$unwind之后“過濾”:

[

{ "$unwind": "$channelStatuses" },

{ "$project": {

"customerId": 1,

"channel": 1,

"status": "$channelStatuses.status",

"same": { "$eq": [ "$channelStatuses.status", "$channel" ] }

}},

{ "$match": { "same": true } },

{ "$group": {

"_id": "$_id",

"customerId": { "$first": "$customerId" },

"channel": { "$first": "$channel" },

"status": { "$first": "$status" }

}},

{ "$group": {

"_id": {

"customerId": "$customerId",

"channel": "$channel",

"status": "$status"

},

"count": { "$sum": 1 }

}}

]

在比MongoDB 2.6更小的版本中,您還需要$project兩個字段之間的相等性測試結果,然后在單獨的階段中對結果進行$匹配.您可能還會注意到“兩個”$group階段,因為第一個階段會在過濾器之后通過$first累加器刪除任何可能的“通道”值的重復項.以下$group與上一個列表中的完全相同.

但是如果你不能改變結構并且需要“靈活”匹配你不能提供每個名字的鍵,那么你必須使用mapReduce:

db.collection.mapReduce(

function() {

emit({

"customerId": this.customerId,

"channel": this.channel,

"status": this.channelStatuses[this.channel].status

},1);

},

function(key,values) {

return Array.sum(values);

},

{ "out": { "inline": 1 } }

)

你當然可以使用那種表示法

總結

以上是生活随笔為你收集整理的mongodb 分组聚合_MongoDB按键值对进行聚合/分组的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。