2016-08-05 4 views
0

私は自分のアプリケーションを使用する各ユーザーの一連のデータを構築しています。シリーズからの最後の挿入を取得

ドキュメント形式は、私は(「はuserId」で)ユーザーのリストについては、(「タイムスタンプ」との)データを挿入し、最後取得するための単純なクエリを探しています

{ "userId": String, "timestamp": DateTime, "data": Data } 

に従っています。

現在の実装を参照してください。

userIds.forEach(function(id){ 
    db.data.find({"userId":id}).sort({"timestamp":-1}).limit(1); 
}); 
+0

このクエリの結果として、1つのドキュメントまたは一連のドキュメントを取得したいですか(それぞれの 'userId'に最も古い' data')? – tarashypka

+0

'' 'userId''で1つの文書が必要です – sestegra

答えて

3

これを実現するにはaggregation-frameworkを使用できます。文書

{ "userId" : "1", "timestamp" : 1470385420806, "data" : "123" } 
{ "userId" : "1", "timestamp" : 1470386440616, "data" : "456" } 
{ "userId" : "2", "timestamp" : 1470385598845, "data" : "222" } 
{ "userId" : "2", "timestamp" : 1470385602249, "data" : "333" } 

の収集のための1つの$groupステージとtimestampフィールド

db.yourCollection.aggregate( 
    { $group: { _id: "$userId", "last": { $max: "$timestamp" } } } 
); 

$maxオペレータとの集約パイプラインは、あなたが期待するものであると思われる結果

{ "_id" : "1", "last" : 1470386440616 } 
{ "_id" : "2", "last" : 1470385602249 } 

を与えるだろう。

0

複数のユーザーをクエリに指定し、タイムスタンプで並べ替えて1つだけ返すことができます。ただ、このように:だから

db.users.find({userId: {$in:[your_list_ids]}}, {fields_you_need}).sort({timestamp: -1}).limit(1)

、この要求は(そのuserIdを配列している誰も、)グループ内のすべてのユーザーを見つけ、その後、「タイムスタンプ」フィールドで降順にそれらをソートし、1つのレコードにあなたの出力を制限します。

覚えておく!ソートを高速に保つには、ソートされたフィールドにインデックスを適用する必要があります。

+0

4 IDを要求した場合、結果は4つの結果になります。 – sestegra

関連する問題