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

如何在MongoDB中对$组中推送的数据进行排序和限制[重复]

谭正谊
2023-03-14

也许有人知道。。我的mongoDB集合中的每个文档如下所示:

[
  _id: 1,
  login: user1,
  strength: {
    a: 5,
    b: 2
  },
  group: 2
]

如何找到每个组中强度. a和强度. b之和最大的前10个文档?

示例:我有这样的文件:

[ login: login1, group: 2, strength: { a: 2, b: 5 } ]

[ login: login2, group: 1, strength: { a: 1, b: 2 } ]

[ login: login3, group: 3, strength: { a: 1, b: 4 } ]

[ login: login5, group: 1, strength: { a: 1, b: 1 } ]

[ login: login6, group: 1, strength: { a: 10, b: 4 } ]

[ login: login7, group: 3, strength: { a: 0, b: 2 } ]

[ login: login8, group: 3, strength: { a: 11, b: 4 } ]

我想得到结果:

[ group: 1, users: [ { login: login6, sumOfStrength: 14 }, { login: login2, sumOfStrength: 3 } ] ]

[ group: 2, users: [ { login: login1, sumOfStrength: 7 } ] ]

[ group: 3, users: [ { login: login8, sumOfStrength: 15 }, { login: login3, sumOfStrength: 5 } ] ]

总之,在本例中,我希望得到按“group”字段分组的结果,并仅从每组中选择前两个字段总数最大的“a”和“b”文档。这是否可行?

到目前为止,我做到了:

db.collection('myCollection').aggregate( 
[ 
  { $group: { _id: '$group', users: { $push: { login: '$login', sumOfStrength: { $sum: [ '$strength.a', '$strength.b'] } } } } } 
] )

但如何排序和限制每个组的数组“用户”中的元素数?

共有2个答案

戚阳
2023-03-14

快完成了,我有:

db.collection('xxx').aggregate( [ 

    { $project: { _id: 1, group: 1, sumOfStrength: { $sum: [ '$strength.a', '$strength.b'] } } },   
    { $sort: { group: 1, sumOfStrength: -1 } },
    { $group: { _id: '$group', users: { $push: { login: '$login', sumOfStrength: '$sumOfStrength' } } } }
]);

我必须把$切片放在哪里?在$组操作或另一个$项目中的某个地方?我不知道...

韦安顺
2023-03-14

这里有一些方向:

  1. 首先将a和b字段(使用id字段分组)求和到每个文档的新字段中(您可以在聚合中执行此操作,也可以在文档结构中添加新字段。我会添加一个新字段,以便您可以使用此字段创建索引)
 类似资料:
  • 我有一个像这样的mongoDB结果。 我需要排序降序。 下面是返回上述结果的查询。我在各个阶段都尝试过使用sort,但没有成功。 需要插入排序操作的地方,按计数降序排序。

  • 问题内容: 该问题旨在作为有关PHP中数组排序问题的参考。容易想到您的特定案例是独特的,值得提出新的问题,但是实际上大多数都是此页面上一种解决方案的细微变化。 如果您的问题作为该问题的重复而被关闭,请仅在您可以解释为什么该问题与以下所有内容明显不同时才要求重新提出您的问题。 如何在PHP中对数组排序? 如何在PHP中对 复杂 数组进行排序? 如何在PHP中对对象数组进行排序? 有关使用PHP现有功

  • 本文向大家介绍如何在MongoDB中推送数组?,包括了如何在MongoDB中推送数组?的使用技巧和注意事项,需要的朋友参考一下 要推送数组,请在MongoDB中使用$push。首先让我们创建一个包含文档的集合- 在方法的帮助下显示集合中的所有文档- 这将产生以下输出- 以下是推送数组的查询- 这将产生以下输出-

  • 问题内容: MongoDB菜鸟在这里… 好的,我有一个学生集合,每个学生的记录看起来都如下所示:我想按降序对“类型”:“作业”分数进行排序。 mongo外壳上的咒语是什么样的? 我正在尝试这个咒语… 但它不起作用。 问题答案: 您将需要在应用程序代码中或在MongoDB 2.2中使用新的AggregationFramework来操纵嵌入式数组。 Shell中的示例聚合: 样本输出:

  • 我有一个具有以下模式的待售项目集合: 我继承了一个聚合查询,它返回匹配类别的项目,按商家分组,组按组中的最大评级排序: 在此之后,代码继续按评级对每组中的项目进行排序,并删除除每组中排名前2位之外的所有项目。 作为聚合函数的一部分,是否可以在组内执行此排序和限制,以便聚合只返回每组中评级最高的两个项目?

  • 例如,我有一个收藏: 如何在MongoDB中进行查询以按分组,然后按排序并以进行。我想得到这样的: