2016-07-08 1 views
1

mongodbコレクションのトップ "グローバル"値を取得したい。 のは、私はこのコレクションを持っているとしましょう:文書から複数のintを取得するそれらを値で指定し、それらを組み合わせてコレクションの上位の結果を得る

[{ 
    "_id": 1, 
    "elo": { 
    "kit1": 1020, 
    "kit2": 1000, 
    "kit3": 1007 
    } 
}, 
{ 
    "_id": 2, 
    "elo": { 
    "kit1": 1041, 
    "kit2": 1065, 
    "kit3": 1051 
    } 
}] 

_id: 1のグローバルELOは1009_id: 2だろう1052

だろうだから私は期待していた結果は次のとおりです。

[ 
    { 
    "_id": 2, 
    "global": 1052 
}, 
{ 
    "_id": 1, 
    "global": 1009 
} 
] 

私が書かれていますこのクエリ:

([ 
    { $group: ("global": { $sum: "/*What to do here when I have multiple values*/" } } }, 
    { $sort: { "global": -1 } }, 
    { $limit: 10 }} 
    ]) 

しかし、私はこの解決策になってしまった。これは

aggregate([ 
    { "$group": {"_id": "$_id", "global": {"$avg": "$elo"} } }, 
    { "$sort": { "global": -1 } }, 
    { "$limit": 10 } 
    ]); 
+0

'kit1'、' kit2'、および 'kit3'フィールドは必要ですか? 'elo'フィールドが配列の場合、あなたのコレクションはまだ動作しますか? –

+1

'group'の代わりに' project'を集約してください。https://docs.mongodb.com/manual/reference/operator/aggregation/avg/ – Yogesh

+0

@JerodJohnsonはい、必要です。実際のキット名はこれとはまったく異なります例 – User

答えて

0

を立ち往生しています:私はキットのIDを知っていたので

aggregate(asList(
    new Document("$project", 
    new Document("global", new BsonArray(getKitArray()))), 
    new Document("$skip", pos), 
    new Document("$limit", 1))); 

、私は基本的にそれらを包みました

getKitArray()についてはこれを使用しました。

List<BsonValue> kits = new ArrayList<>(); 
for (int i = 0; i < kits.size(); i++) { 
    kits.add(new BsonString("$" + ArenaKit.kits.get(i).id)); 
} 
return kits; 
+0

これはint型の配列ではないため動作しません – User

0

を動作するはずです$グループに一部

関連する問題