2017-09-21 65 views
2

也許有人知道.. 在我的MongoDB集合中的每個文檔的樣子:

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

如何找到各組前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 } ] ] 

總之,在這個例子中,我想用「組」分組結果字段,並且只選擇每個組中具有最多「a」和「b」字段的前兩個文檔。這是可行的嗎?

直到現在我做到了:

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

但如何在數組「用戶」元素爲每個組的排序和數量限制?

+0

你到目前爲止做了什麼? – barbakini

+0

現在請看。我添加了更多信息。 – nelkor

回答

0

這裏的一些方向:

  1. sumab領域第一(與 _id場分組)成每個文檔的新領域(你可以在聚集做到這一點,或者你可以在你的文檔中添加一個新的領域結構。我想補充一個新的領域,所以你可以創建具有這方面的指標)
  2. sort文件與group和新創建a+b領域
  3. 讓你group OPER通貨膨脹和push(推將已經排序)
  4. 使用slice得到users陣列的只有第2個元素
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' } } } } 
]); 

在哪裏我已經把$片?在$ group操作或另一個$項目中的某處?我不知道..

+0

你可以在另一個'$ project'中做。文檔鏈接有例子 – barbakini

+0

我明白了!非常感謝 – nelkor