7

私はこれらのドキュメントをコレクションに持っています:

   {topic : "a",
    messages : [ObjectId("21312321321323"),ObjectId("34535345353"),...]
   },
   {topic : "b,
    messages : [ObjectId("1233232323232"),ObjectId("6556565656565"),...]
   }

メッセージフィールドの組み合わせで結果を得る可能性はありますか?私はこれを例えば取得するのが好きです:

     {[
       ObjectId(""),ObjectId(""),ObjectId(""),ObjectId("")
     ]}

これはMapReduceで可能だと思いましたが、私の場合、ドキュメントに共通点はありません。現在、JavaScriptとループを使用してバックエンドでこれを行っていますが、これは最善のオプションではないと思います。ありがとう。

4

2 に答える 2

5

AggregationFramework$groupで演算子を使用できます。もちろん、Aggregation Frameworkを使用するには、MongoDB2.2以降で実行していることを確認する必要があります。

一緒に使用すると$push、メッセージのすべてのリストが連結されます。

db.myCollection.aggregate({ $group: { messages: { $push: '$messages' } } });

一緒に使用すると$addToSet、個別の値のみが取得されます。

db.myCollection.aggregate({ $group: { messages: { $addToSet: '$messages' } } });

また、最初に候補ドキュメントをフィルタリングする場合は、を使用できます$match

db.myCollection.aggregate([
    { $match: { topic: { $in: [ 'a', 'b' ] } } },
    { $group: { matches: { $sum: 1 }, messages: { $push: '$messages' } } }
]);
于 2013-01-12T23:18:29.407 に答える
1

1つのオプションは、集約フレームワークを使用することです。

ただし、(「軽量」の結果だけでなく)多数の結果、16 MBを超えるサイズの結果ドキュメント、または過剰なシステムメモリの使用を計画している場合は、オブジェクト内のオブジェクトをループするだけで済みます。結果を手動で収集して連結するか(今実行している可能性があることを示唆しているように)、mongodbが例外をスローするリスクがあります。

集計制限は、このページの下部にあります。

http://docs.mongodb.org/manual/applications/aggregation/

制限があるため、プロジェクションでfindを使用して、だけを返すことができmessagesます。

(そして、このような場合は、パフォーマンスベンチマークを実行して、オプションをサーバー上のデータと比較することを強くお勧めします。「インターネット」は、アグリゲーションのサポートが他の手法よりも遅いと感じている人がいることを示しています) 。

于 2013-01-12T23:40:24.977 に答える