如何在MongoDB中对$ group中的推送数据进行排序和限制

时间:2017-09-21 15:01:48

标签: javascript mongodb

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

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

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

实施例: 我有这样的文件:

[ 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 } ] ]

总之,在这个例子中,我希望得到按"组"分组的结果。字段,并且只选择总数最大的前两个文件" a"和" b"每组的字段。这可行吗?

到现在为止我做到了:

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

但是如何排序和限制数组中的元素数量"用户"每个小组?

2 个答案:

答案 0 :(得分:0)

这里有一些指示:

    首先将
  1. sum ab字段(使用 _id字段分组)放入每个文档的新字段中(您可以在聚合中执行此操作,也可以添加文档结构中的新字段。我将添加一个新字段,以便您可以使用此字段创建索引)
  2. sort包含group和新创建的a+b字段
  3. 的文档
  4. 进行group操作,push(推送已经排序)
  5. 使用slice仅获取users数组
  6. 的前2个元素

答案 1 :(得分:0)

它差不多完成了,我有:

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' } } } }
]);

我必须把$ slice放?在$ group操作或另一个$ project中的某个地方?我不知道..