当前位置: 首页 > 知识库问答 >
问题:

Mongo DB:根据具有嵌套数组的文档聚合文档输出

马欣荣
2023-03-14

系统在数据库中具有以下文档信息:

{
   "systemName": "ABC",
    "systemUsageAttrs" : [
                          {
                           "cpuUsage": 30,
                           "memUsage": 40,
                           "isActive": false
                           },
{
                           "cpuUsage": 88.2,
                           "memUsage": 33.5,
                           "isActive": false
                           },
                           {
                           "cpuUsage": 66.3,
                           "memUsage": 79.5,
                           "isActive": true
                           },
                           {
                           "cpuUsage": 80.5,
                           "memUsage": 63,
                           "isActive": true
                           }
                         ]
}

我已经尝试了使用 mongo java 驱动程序进行重新设置,下面是以下代码片段:

List<Document> systemDetailsAL = sysUsageDetailsColl.aggregate(
                asList(
                        match(eq("systemName","ABC")),
                        unwind("$systemUsageAttrs"),
                        match(eq("systemUsageAttrs.isAcive",true)),
                        group("$_id", Accumulators.push("systemName","$systemName"),
                                Accumulators.push("systemUsageAttrs", "$systemUsageAttrs")),
                        project(Projections.fields(Projections.excludeId(), 
                                                Projections.include("systemName", "systemUsageAttrs")))
                        
                        )
                ).into(new ArrayList<Document>());

上面为我提供了带有两个元素的ArrayList的输出,第0个元素是带有键“systemName”的Document,值是带有两个元件的Array List。第1个位置元素与键为“systemUsageAttrs”的Document一起,值为ArrayList,包含两个元素,即所有系统使用详细信息。

尝试的另一件事是编译组部分是上面的代码,因此它为我提供了 2 个文档的列表

{
    serverName: ABC, 
    systemUsageAttr: {
        cpuUSage: xxx, 
        memUsage: yyy, 
        isActive:true
}}

和第二份文件

{
    serverName: ABC, 
    systemUsageAttr: {
        cpuUSage: ttt, 
        memUsage: sss, 
        isActive:true
}}

是否可以使用聚合返回一个只有 1 个元素的列表,例如它给出以下输出

{
    serverName: ABC, 
    systemUsageAttr: [
        {
         cpuUSage: xxx, 
         memUsage: yyy, 
         isActive:true
        },
        {
         cpuUSage: ttt, 
         memUsage: sss, 
         isActive:true
        }
}

感谢任何帮助或指点。

共有1个答案

裴彦
2023-03-14

改变这两个阶段:

group("$_id", Accumulators.push("systemName","$systemName"),
              Accumulators.push("systemUsageAttrs", "$systemUsageAttrs")),
project(Projections.fields(Projections.excludeId(), 
        Projections.include("systemName", "systemUsageAttrs")))                
)

如下,以获得期望的结果:

group("$_id", Accumulators.push("systemUsageAttrs", "$systemUsageAttrs"), 
              Accumulators.first("systemName", "$systemName")), 
project(Projections.excludeId()))

请注意< code>Accumulators.first(第一个组聚合运算符)的用法。

 类似资料:
  • 多亏了这里的人的帮助,我成功地在我的文档中找到了两个ID,并在另一个集合中找到了他们的代表文档。我需要采取的下一步是进一步查找一个“嵌套”ID(引用另一个集合中的文档)。 其结果如下: 我希望chieftain部分是这样的(这就是没有添加'last'$lookup'的chieftain文档的样子):

  • ` ` 我需要使用MongoDB shell命令查询此文档。 我已经尝试过查看$[]、$all和挖掘mongo文档,但似乎都没用。任何想法都是赞赏,谢谢!

  • 我有一个名为results的集合,其中每个文档都有一个标记(唯一)和一个嵌入文档(服务)列表。 样本: 我想使用mongo模板(spring boot)提取一个基于令牌和服务id的服务。下面是一个代码片段: 服务级别: 上面的代码执行此查询: 方法返回空Service对象! 为了获得服务对象,我的聚合中是否有任何更改要做?

  • 我需要更新Mongo DB中另一个文档内的数组中的一个文档

  • 问题内容: 我如何在mongodb文档中嵌套文档的地方搜索文档。例如,我有一组私人消息。每条私人消息都有两个嵌套文档- 一个代表发送用户,另一个代表接收使用。两个嵌套文档的格式均为- userID:34343,名称:Joe Bloggs 我希望能够搜索用户发送的所有邮件(例如,搜索发件人用户的嵌套文档)。 我正在使用Java驱动程序。我是否需要创建一个代表嵌套文档的DBObject? 谢谢 问题答

  • 我想在具有指定 URL 的相应文档中将嵌套的“已爬行”更新为 True。 我对mongodb相当陌生,我似乎无法弄清楚这一点,非常感谢任何帮助。