合并 MongoDB 聚合中的数组字段

2023-12-25

使用 MongoDB 聚合框架时是否可以合并数组字段?这是我试图解决的一个摘要问题:

用于聚合的示例输入文档:

{
  "Category" : 1,
  "Messages" : ["Msg1", "Msg2"],
  "Value" : 1
},
{
  "Category" : 1,
  "Messages" : [],
  "Value" : 10
},
{
  "Category" : 1,
  "Messages" : ["Msg1", "Msg3"],
  "Value" : 100
},
{
  "Category" : 2,
  "Messages" : ["Msg4"],
  "Value" : 1000
},
{
  "Category" : 2,
  "Messages" : ["Msg5"],
  "Value" : 10000
},
{
  "Category" : 3,
  "Messages" : [],
  "Value" : 100000
}

我们希望按“类别”进行分组,同时总结“价值”并合并“消息”。我尝试过这个聚合管道:

{group : {
        _id : "$Category",
        Value : { $sum : "$Value"},
        Messages : {$push : "$Messages"}
    }
}, 
{$unwind : "$Messages"}, 
{$unwind : "$Messages"}, 
{$group : {
        _id : "$_id",
        Value : {$first : "$Value"},
        Messages : {$addToSet : "$Messages"}
    }
}

结果是:

"result" : [{
        "_id" : 1,
        "Value" : 111,
        "Messages" : ["Msg3", "Msg2", "Msg1"]
    }, 
    {
        "_id" : 2,
        "Value" : 11000,
        "Messages" : ["Msg5", "Msg4"]
    }
]

然而,这完全错过了类别 3,因为“类别”为 3 的文档没有任何“消息”,并且它们在第二次展开时被删除。我们希望结果还包括以下内容:

{
    "_id" : 3,
    "Value" : 100000,
    "Messages" : []
}

聚合框架是否有一种巧妙的方法来实现这一目标?


如果 Messages 保证是一个数组,您可以使用以下技巧:

> db.messages.find()
    { "Category" : 1, "Messages" : [  "Msg1",  "Msg2" ], "Value" : 1 }
    { "Category" : 1, "Messages" : [ ], "Value" : 10 }
    { "Category" : 1, "Messages" : [  "Msg1",  "Msg3" ], "Value" : 100 }
    { "Category" : 2, "Messages" : [  "Msg4" ], "Value" : 1000 }
    { "Category" : 2, "Messages" : [  "Msg5" ], "Value" : 10000 }
    { "Category" : 3, "Messages" : [ ], "Value" : 100000 }

> var group1 = {
    "$group":   {
        "_id":      "$Category",
        "Value":    {
            "$sum":     "$Value"
        },
        "Messages": {
            "$push":    "$Messages"
        }
    }
};

> var project1 = {
    "$project": {
        "Value":    1,
        "Messages": {
            "$cond":    [
                {
                    "$eq":  [
                        "$Messages",
                        [ [ ] ]
                    ]
                },
                [ [ null ] ],
                "$Messages"
            ]
        }
    }
};

> db.messages.aggregate( group1, project1 )
    { "_id" : 3, "Value" : 100000, "Messages" : [  [  null ] ] }
    { "_id" : 2, "Value" : 11000, "Messages" : [  [  "Msg4" ],  [  "Msg5" ] ] }
    { "_id" : 1, "Value" : 111, "Messages" : [  [  "Msg1",  "Msg2" ],  [ ],  [  "Msg1",  "Msg3" ] ] }

现在展开两次并重新分组以获得单个 Messages 数组。

> var unwind = {"$unwind":"$Messages"};

> var group2 = {
    $group: {
        "_id":      "$_id", 
        "Value":    {
            "$first":       "$Value"
        }, 
        "Messages": {
            "$addToSet":    "$Messages"
        }
    }
};

> var project2 = {
    "$project": {
        "Category": "$_id",
        "_id":      0,
        "Value":    1,
        "Messages": {
            "$cond":    [
                {
                    "$eq":  [
                        "$Messages",
                        [ null ]
                    ]
                },
                [ ],
                "$Messages"
            ]
        }
    }
};

> db.messages.aggregate(group1, project1, unwind, unwind, group2 ,project2 )
    { "Value" : 111, "Messages" : [  "Msg3",  "Msg2",  "Msg1" ], "Category" : 1 }
    { "Value" : 11000, "Messages" : [  "Msg5",  "Msg4" ], "Category" : 2 }
    { "Value" : 100000, "Messages" : [ ], "Category" : 3 }
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

合并 MongoDB 聚合中的数组字段 的相关文章

  • MongoDB $orderby 和 Sort 之间的区别

    我想获取最新的文档 这显然是一个文档 因此findOne应该可以正常工作 但findOne这里返回插入的第一个文档 所以我现在有两个选择要么使用 orderBy with findOne or use sort 功能与 limit in f
  • MongoDB 在仅返回 _id 时使用 COLLSCAN

    我想返回 MongoDB 集合中的所有 ID 我使用了以下代码 db coll find id 1 但MongoDB扫描整个集合而不是从默认读取信息index id 1 从日志中 find collection filter project
  • 更新插入 MongoDB 时如何防止出现“_t”字段?

    我有一个应用程序 它使用 MongoDB 的 C 驱动程序将 Upsert 插入 MongoDB 数据库 当我打电话给Update函数 我无法指定我要更新的类型 然后 t字段插入元素的类型 这是我用来更新插入的代码 collection U
  • 使用 AWS MSK 连接器连接到 AWS VPC 内的 MongoDB atlas

    我正在尝试使用MongoDB使用更改流Kafka 我选择 AWS MSK 是因为我的整个基础设施都位于 AWS 内 并且可以轻松与其他 AWS 服务集成 I created an AWS MSK cluster within the VPC
  • 元素数组中数组的 MongoDB 全文

    当元素数组中的数组包含应与我的搜索匹配的文本时 我无法检索文档 以下是两个示例文档 id foo name Thing1 data text X X name Thing2 data text X Y id foo
  • NodeJS:将 JSON 保存到 MongoDB

    我正在尝试从 API 获取 JSON 并将其存储到 MongoDB 数据库中 显然 这是行不通的 我的应用程序似乎停留在我尝试将数据保存到数据库的位置 请告知该怎么做 这是我的代码 var express require express v
  • 让 MongoDB 在 Linux 上监听远程连接

    我已在 Windows 本地计算机上 上成功安装 MongoDB 作为服务 但现在我想将 MongoDb 移动到单独的服务器 所以我将 tarball 解压到网络上的虚拟服务器 运行 Linux 当我从本地计算机使用 PuTTY 连接到服务
  • (节点:20732)[DEP0018] DeprecationWarning:未处理的承诺拒绝已被弃用。未来在nodejs中

    我正在尝试在我的应用程序中生成确认链接 虽然它工作正常并且也生成链接 但是当我访问该链接时 它在 Chrome 控制台中显示 POST http localhost 3000 api auth confirmation 400 Bad Re
  • Strapi 未加载 Digital Ocean 上托管的现有 MongoDB 中的集合

    我正在使用 Strapi 创建一个新应用程序 并尝试将其与托管在 Digital Ocean 上的 MongoDB 连接 但不幸的是Strapi 无法从现有 MongoDB 获取集合 在这里 我提到我实现 Strapi 与现有 MongoD
  • 如何在 mongodb 聚合管道中使用 Javascript 对象?

    我有一个 JS 对象norm我想在 mongo 聚合管道中使用它 如下所示 var norm 1 1 2 1 16 3 1 413 4 1 622 5 1 6 6 1 753 7 3 001 8 2 818 9 3 291 10 2 824
  • 按一个字段聚合,选择另一个字段最大值的文档作为集合

    使用聚合框架 获取每个分组的字段最大值的文档的最佳方法是什么 因此使用下面的集合 我希望具有为每个具有最新日期的 group id 返回一个文档的功能 第二个清单显示了所需的结果 group id date 1 11 1 12 1 11 2
  • MongoDB 3.0 Windows 服务启动:发生系统错误 2

    我已经下载了 MongoDB Windows msi 安装并成功运行 mongod exe 和 mongo exe 命令文件执行工作正常 安装手册展示了如何创建配置文件 然后使用命令创建Windows Server sc exe creat
  • 最小验证在 Mongoose 中不起作用

    我有一个架构 其中余额字段的声明如下所示 balance type Number min 0 default 30 我将 0 设置为最小值 这样余额就不会为负值 但是当我通过更新查询减少余额值时 余额结果是负值 我的更新查询 User up
  • Express中间件修改请求

    我目前有一个正在运行的服务器 前端使用nodejs mongo express 和 W2UI W2ui 请求来自包含所有参数的记录数组 记录 名称 foo 我想编写一个中间件 在请求到达路由之前对其进行编辑和更改 您可以创建自己的中间件来处
  • Meteor.setTimeout 和 Meteor.methods 之间的并发

    在我的 Meteor 应用程序中实现回合制多人游戏服务器 客户端通过发布 订阅接收游戏状态 并且可以调用 Meteor 方法sendTurn将回合数据发送到服务器 他们无法直接更新游戏状态集合 var endRound function g
  • MongoDB 聚合:如何检查数组中是否存在包含多个属性的对象

    我有一个对象数组 我想检查是否有一个对象与多个属性匹配 我尝试过使用 in and and但它并没有按照我想要的方式工作 这是我当前的实现 https mongoplayground net p dEQp2Q4DW0j 我有一个像这样的数组
  • 在 Meteor 中运行示例的问题

    我正在测试 Meteor 示例 这是我运行时看到的meteor在待办事项示例中 Unexpected mongo exit code 100 Restarting Unexpected mongo exit code 100 Restart
  • 护照本地猫鼬帐户注册的附加字段?

    我将 Passport local mongoose 与 Node js Express js MongoDB 一起用于 Web 应用程序 我想使用用户名字段 密码字段 公司名称字段和电话号码字段 所有字段 来注册用户作为字符串 但是 我只
  • 限制号mongodb 输入中的行数

    如何限制数量 在kettle中使用的mongodb输入转换中检索到的行数 我尝试在 mongodb 输入查询中使用以下查询 但它们都不起作用 查询 限制 10 或 limit 10 请让我知道我哪里出错了 谢谢 迪普蒂 有几个查询修改操作符
  • MongoDB:在具有未知键的对象中查找给定字段值的文档

    我正在建立一个关于论文 论点的数据库 它们与其他参数相关 我将这些参数放置在带有动态键 https stackoverflow com questions 12393351 using a variable in mongodb updat

随机推荐

  • Angular:Nodemailer 显示大量运行时错误

    在我的角度项目中 我想使用节点邮件程序发送邮件 第一个问题是当我尝试导入时 我的意思是在执行 npm i save 之后 当我这样做时会发生很多错误ionic serve 我想重复一件事 写完之后import行 这个大错误日志来了 应用程序
  • System.IO.File.Delete() / System.IO.File.Move() 有时不起作用

    Winforms 程序需要将一些运行时信息保存到 XML 文件中 该文件有时可能有几百千字节大小 在 Beta 测试期间 我们发现一些用户会毫不犹豫地看似随机地终止进程 有时会导致文件写入一半并因此损坏 因此 我们更改了算法以保存到临时文件
  • 语音搜索权限

    Running 谷歌语音搜索 https play google com store apps details id com google android voicesearch在我的 ICS Android 4 0 4 平板电脑上出现奇怪
  • 用于为 Java 应用程序构建交互式 shell 的库 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我正在寻找可以让我创建交互式 shell 的 Java 库 我已经做了一些搜索 但还没有找到很多 我发现的大部分内容都是用于向我的应用程序
  • Docker:使用 --volume 绑定安装的文件权限

    我遵循以下指南 https denibertovic com posts handling permissions with docker volumes https denibertovic com posts handling perm
  • C++ 使用模板对象进行操作

    我有课 class BarBase 和一个派生模板类 它存储一个指向成员函数的指针和一个指向同一类的对象的指针 template
  • Excel/VBA - 如何在字符串中每 N 个字符插入一个字符

    我有一份报告 导出时它在单个单元格中将订单号 始终为 7 位长 显示为单个字符串 例如 订单 1234567 和 9876543 将在单个单元格中显示为 12345679876543 每个单元格没有最大订单数 每个单元格的最大订单数都不同
  • 如何以编程方式更改 Mac OS X 中的背景?

    我将如何以编程方式更改 Mac OS X 中的桌面背景 我想使用 python 但我对任何可能的方式都感兴趣 我可以连接到终端并调用某个命令吗 来自 python 如果你有应用脚本 http appscript sourceforge ne
  • 如何将 URL 数组中的图像列表添加到文档中?

    假设我有一个充满图像源 URL 的数组 例如 var imgs http lorempizza com 380 240 http dummyimage com 250 ffffff 000000 http lorempixel com g
  • 将记录添加到 has_and_belongs_to_many 关系

    我有两个模型 用户和促销 这个想法是 一个促销可以有很多用户 一个用户可以有很多促销 class User lt ActiveRecord Base has and belongs to many promotions end class
  • Intellij 14 + lombok:@Slf4j 找不到符号日志

    Intellij 无法识别 SLF4J 注释 我有以下错误 Error 105 9 java cannot find symbol symbol variable log location class com xxxxx SdsConfig
  • 从groovy脚本加载脚本

    文件1 groovy def method println test 文件2 groovy method 我想在运行时加载 包含 File1 groovy 中的函数 方法 相当于 ruby s rake 的加载 它们位于两个不同的目录中 如
  • 如何在 Google Colab 中拆分代码单元?

    使用Jupyter Notebook我发现分割单元格的功能非常有用 我也想在 Google Colab 中执行此操作 但我找不到如何执行此操作 能做到吗 如果答案是肯定的 怎么办 我不知道如何通过菜单选择来完成此操作 但在 Jupyter
  • 使用 NetNamedPipe 的 WCF 多个应用程序

    我正在尝试在同一台计算机上运行多个 WCF 服务托管应用程序 我想运行多个应用领域 不在一个应用程序中提供多项服务 var host new ServiceHost typeof MyClass1 new Uri new Uri net p
  • redis-py 退出时不关闭线程

    我正在使用 redis py 2 10 6 和 redis 4 0 11 我的应用程序使用 redis 作为数据库和 pubsub 当我关闭时 我经常会遇到挂起或崩溃的情况 后者通常会抱怨处理 pubsub 回调时发生的错误文件描述符或文件
  • Access 中的多个 LEFT JOIN

    我有以下查询 适用于 MySQL DELETE test1 test2 test3 test4 FROM test1 LEFT JOIN test2 ON test2 qid test1 id LEFT JOIN test3 ON test
  • PHP中如何检查IP地址是否在两个IP范围内?

    我有一个 IP 地址 并且还获得了另外两个 IP 地址 它们一起创建了一个 IP 范围 我想检查第一个IP地址是否在这个范围内 我怎样才能在 PHP 中找到它 With ip2long http php net manual en func
  • 自定义单选ListView

    我想制作一个自定义列表视图 在一行中具有两个 TextView 和一个单选按钮 在列表项上单击单选按钮状态应为切换 我不能在这里使用简单适配器 我已经问过这个问题了单选ListView自定义Row Layout https stackove
  • Android 工具栏仅在 AppBarLayout 折叠时显示标题和副标题

    我有 AppBarLayout CollapsingToolbarLayout 和工具栏的活动 从代码中设置标题和副标题 最初我希望工具栏隐藏并在应用栏布局折叠时显示 使用我的代码 它可以工作 工具栏最初隐藏 但它始终显示工具栏标题和副标题
  • 合并 MongoDB 聚合中的数组字段

    使用 MongoDB 聚合框架时是否可以合并数组字段 这是我试图解决的一个摘要问题 用于聚合的示例输入文档 Category 1 Messages Msg1 Msg2 Value 1 Category 1 Messages Value 10