9

次のコレクションがあるとします。

{ _id: 1, Array: [
  { K: "A", V: 8 },
  { K: "B", V: 5 },
  { K: "C", V: 13 } ] }

{ _id: 2, Array: [
  { K: "D", V: 12 },
  { K: "E", V: 14 },
  { K: "F", V: 2 } ] }

最高の「V」を持つサブドキュメントを返すクエリを実行したいので、その場合は次のようになります。

{ _id: 1, Array: [ { K: "E", V: 14 } ] }

または単に:

{ K: "E", V: 14 }

重要な部分は、Mongo サーバーのメモリ使用量を O(1) にしたいことです (処理するドキュメントの数に関係なく、メモリ使用量は一定です)。必要な値を持つその 1 つのサブドキュメントのみを取得したい(必要以上のサブドキュメントをダウンロードしたくありません)。

私の好みのアプローチは、単純な検索クエリを使用することですが、それが可能かどうかはわかりません。これは集計フレームワーク (または map reduce ?) でも実行できると思いますが、方法がわかりません。結果を一時的なコレクションに保存するのではなく、(通常のクエリのように) クライアントに直接返します。

4

3 に答える 3

9

次の集約セットは、必要なものを返します。

db.letters.aggregate([
    {$project:{"Array.K":1, "Array.V":1}},
    {$unwind:"$Array"},
    {$sort:{"Array.V":-1}},
    {$limit:1}
]);

戻り値:

{"_id":2, "Array":{"K":"E","V":14}}

楽しみ!:)

于 2013-02-15T19:53:07.690 に答える
2

@JohnnyHKが言ったように:

db.col.aggregate([
    {$unwind: '$Array'},
    {$group: {_id: '$_id', Array: {K: {$max: '$K'}, V: {$max: '$V'}}}}
])

そんな感じ。

于 2013-02-15T15:35:26.177 に答える