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

$在聚合框架中展开一个对象

颜啸
2023-03-14
variants: [

    {
        name: 'variant1', 
        genotypes: {

            person1: 2,
            person2: 5,
            person3: 7,

        }
    }, 

    {
        name: 'variant2', 
        genotypes: {

            person1: 3,
            person2: 3,
            person3: 2,

        }
    }

]

共有1个答案

章城
2023-03-14

不可能使用聚合框架进行所描述的那种计算--这不是因为没有用于非数组的$unwind方法。即使Person:value对象是数组中的文档,$unwind也无济于事。

“group by”功能(无论是在MongoDB还是在任何关系数据库中)都是对字段或列的值执行的。我们根据字段的值和基于另一字段的值的SUM/AVERY/ETC进行分组。

简单的示例是您建议的变体,将评等字段添加到示例文章集合中,但不是作为从用户到评等的映射,而是作为如下所示的数组:

{ title : title of article", ...
  ratings: [
         { voter: "user1", score: 5 },
         { voter: "user2", score: 8 },
         { voter: "user3", score: 7 }
  ]
}

现在您可以将其聚合为:

[ {$unwind: "$ratings"},
  {$group : {_id : "$ratings.voter", averageScore: {$avg:"$ratings.score"} } } 
]

但是这个示例按照您所描述的结构应该如下所示:

{ title : title of article", ...
  ratings: {
         user1: 5,
         user2: 8,
         user3: 7
  }
}
{ title : title of article", ...
  ratings: [
         { user1: 5 },
         { user2: 8 },
         { user3: 7 }
  ]
}
CREATE TABLE T (
   user1: integer,
   user2: integer,
   user3: integer
   ...
);
CREATE TABLE T (
   username: varchar(32),
   score: integer
);

现在我们使用SQL进行聚合:

按用户名从T组中选择用户名,平均分数;

对MongoDB的一个增强请求可能允许您将来在聚合框架中这样做--将值投射到键的能力,反之亦然。同时,总是有map/reduce。

 类似资料:
  • MongoDB中的聚合框架有解释功能吗?我在文件里看不到。 我知道找到你就行了 但是在聚合框架中,我得到了一个错误

  • 我在mongodb中的聚合有点问题; 收藏uczelna: 我的合计: 我想找到所有的医生(doktorzy)妇女(名字的最后一个字母a)在一所学校(uczelna)。imie(姓名) 告诉我我做错了什么,谢谢

  • 我正在评估MongoDB聚合框架在多大程度上适合我们的需求,因为我们目前运行在SQL Server之上。我很难执行特定的查询: 假设我有以下伪记录(建模为sql表中的列和mongodb集合中的完整文档) 我很难在mongodb聚合框架中找到合适的结构来执行这样的查询。我可以通过在管道中插入$match来查询单个范围的结果(即获取单个范围的结果),但我无法在单个管道查询中提取所有范围及其计数。

  • 我不熟悉Spring和Mongo。我正在使用Spring Batch获取一些报告。我的查询需要一些MongoItemReader不支持的聚合,所以我根据下面的stackoverflow链接扩展了该类。 如何在Spring批处理中使用MongoItemReader聚合查询 但我的聚合有点问题。我制作的聚合在mongoDB中运行良好,但无法将其转换为Spring mongo聚合。 MongoDb聚合按

  • 是否可以在$match中执行OR? 我的意思是这样的:

  • 任何关于如何实现这一点的指示和/或文件都将不胜感激。