Mongo聚合嵌套数组

编程入门 行业动态 更新时间:2024-10-28 01:15:01
本文介绍了Mongo聚合嵌套数组的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧! 问题描述

我有一个具有以下结构的mongo集合

I have a mongo collection with following structure

{ "userId" : ObjectId("XXX"), "itemId" : ObjectId("YYY"), "resourceId" : 1, "_id" : ObjectId("528455229486ca3606004ec9"), "parameter" : [ { "name" : "name1", "value" : 150, "_id" : ObjectId("528455359486ca3606004eed") }, { "name" : "name2", "value" : 0, "_id" : ObjectId("528455359486ca3606004eec") }, { "name" : "name3", "value" : 2, "_id" : ObjectId("528455359486ca3606004eeb") } ] }

可以有多个文档,这些文档具有相同的"useId"和不同的"itemId",但参数在所有文档中都具有相同的键/值对.

There can be multiple documents with the same 'useId' with different 'itemId' but the parameter will have same key/value pairs in all of them.

我要完成的工作是为每个唯一的"userId"返回聚合参数"name1","name2"和"name3",而无需考虑"itemId".因此最终结果看起来像每个用户:

What I am trying to accomplish is return aggregated parameters "name1", "name2" and "name3" for each unique "userId" disregard the 'itemId'. so final results would look like for each user :

{ "userId" : ObjectId("use1ID"), "name1" : (aggregatedValue), "name2" : (aggregatedValue), "name3" : (aggregatedVAlue) }, { "userId" : ObjectId("use2ID"), "name1" : (aggregatedValue), "name2" : (aggregatedValue), "name3" : (aggregatedVAlue) }

是否可以使用mongoDB的聚合方法来完成此操作?您能帮我建立适当的查询来完成此操作吗?

Is it possible to accomplish this using the aggregated methods of mongoDB ? Could you please help me to build the proper query to accomplish that ?

推荐答案

最简单的形式是使事物以参数"名称"为键:

The simplest form of this is to keep things keyed by the "parameter" "name":

db.collection.aggregate( // Unwind the array { "$unwind": "$parameter"}, // Group on the "_id" and "name" and $sum "value" { "$group": { "_id": { "userId": "$userId", "name": "$parameter.name" }, "value": { "$sum": "$parameter.value" } }}, // Put things into an array for "nice" processing { "$group": { "_id": "$_id.userId", "values": { "$push": { "name": "$_id.name", "value": "$value" }} }} )

如果您真的需要名称的值"作为字段值,则可以执行以下操作.但是,由于要投影"字段/属性,因此必须在代码中全部指定.您再也无法保持动态",并且每个人都编码/生成:

If you really need to have the "values" of names as the field values, you can do the the following. But since you are "projecting" the fields/properties then you must specify them all in your code. You cannot be "dynamic" anymore and you are coding/generating each one:

db.collection.aggregate([ // Unwind the array { "$unwind": "$parameter"}, // Group on the "_id" and "name" and $sum "value" { "$group": { "_id": { "userId": "$userId", "name": "$parameter.name" }, "value": { "$sum": "$parameter.value"} }}, // Project out discrete "field" names with $cond { "$project": { "name1": { "$cond": [ { "$eq": [ "$_id.name", "name1" ] }, "$value", 0 ]}, "name2": { "$cond": [ { "$eq": [ "$_id.name", "name2" ] }, "$value", 0 ]}, "name3": { "$cond": [ { "$eq": [ "$_id.name", "name3" ] }, "$value", 0 ]}, }}, // The $cond put "0" values in there. So clean up with $group and $sum { "$group": { _id: "$_id.userId", "name1": { "$sum": "$name1" }, "name2": { "$sum": "$name2" }, "name3": { "$sum": "$name3" } }}

])

因此,尽管额外的步骤可以为您提供所需的结果(最后一个项目将_id更改为userId),但在我看来,除非您确实需要,否则简短的版本就足够了.还要考虑那里的输出:

So while the extra steps give you the result that you want ( well with a final project to change the _id to userId ), for my mind the short version is workable enough, unless you really do need it. Consider the output from there as well:

{ "_id" : ObjectId("53245016ea402b31d77b0372"), "values" : [ { "name" : "name3", "value" : 2 }, { "name" : "name2", "value" : 0 }, { "name" : "name1", "value" : 150 } ] }

因此,这将是我个人使用的.但是您的选择.

So that would be what I would use, personally. But your choice.

更多推荐

Mongo聚合嵌套数组

本文发布于:2023-11-22 15:26:02,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1617967.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:嵌套   数组   Mongo

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!