2

以下のドキュメントを mongodb コレクションに保存しています。それらは昇順でソートされます。指定した時間内に 1 つのドキュメントのみを取得したい。( node-mongodb ドライバーで node.js を使用しています。) どのように実装すればよいですか?

{"created_at":"2013-03-19T07:14:05Z"}
{"created_at":"2013-03-19T07:35:40Z"}
{"created_at":"2013-03-19T07:59:52Z"}
{"created_at":"2013-03-19T08:01:32Z"}
{"created_at":"2013-03-19T08:02:40Z"}
{"created_at":"2013-03-19T08:02:56Z"}
{"created_at":"2013-03-19T08:06:24Z"}
{"created_at":"2013-03-19T08:07:08Z"}
{"created_at":"2013-03-19T08:23:27Z"}
{"created_at":"2013-03-19T08:27:44Z"}
{"created_at":"2013-03-19T08:27:58Z"}
{"created_at":"2013-03-19T08:28:04Z"}
{"created_at":"2013-03-19T08:28:08Z"}
{"created_at":"2013-03-19T08:28:23Z"}

たとえば、時間間隔が 1 分の場合、期待される結果は次のようになります。

{"created_at":"2013-03-19T07:14:05Z"}
{"created_at":"2013-03-19T07:35:40Z"}
{"created_at":"2013-03-19T07:59:52Z"}
{"created_at":"2013-03-19T08:01:32Z"}
{"created_at":"2013-03-19T08:02:40Z"}
{"created_at":"2013-03-19T08:06:24Z"}
{"created_at":"2013-03-19T08:07:08Z"}
{"created_at":"2013-03-19T08:23:27Z"}
{"created_at":"2013-03-19T08:27:44Z"}
{"created_at":"2013-03-19T08:28:04Z"}

以下の書類は返却しないでください。

{"created_at":"2013-03-19T08:02:56Z"}
{"created_at":"2013-03-19T08:27:58Z"}
{"created_at":"2013-03-19T08:28:08Z"}
{"created_at":"2013-03-19T08:28:23Z"}

ありがとう、

ジェフリー

4

1 に答える 1

4

Map/Reduce はあなたが探しているものです。

コレクションを次のように考えてくださいcreated_at。ID になるドキュメントがあります。created_atまたは、その部分を最大で 1 分と言うべきです。たとえば、この関数は ID を決定するために使用されます。

var GenerateID = function(date) {
    return date.getFullYear() + "/" +
           date.getMonth() + "/" +
           date.getDate() + "." +
           date.getHours() + ":" +
           date.getMinutes();
};

したがって、この関数は日付オブジェクトを年、月、日、時、分を含む文字列に変換します。毎分 1 つのオブジェクトだけが必要なので、秒は気にしません。

ここで、map 関数と reduce 関数を定義する必要があります。たとえば、マップは次のようになります。

var map = function() {
    var key = GenerateID(this.created_at);
    emit(key, this);
};

そして減らす:

var reduce = function(key, values) {
    if (values.length) {
        return values[0];
    }
};

ここでは、取得した最初の値を返すだけです (並べ替えと組み合わせると、必要なものが得られます)。これはキーごとであることに注意してください。

次に、Mongo 側でこのジョブを起動する必要があります。ドライバーによっては、次のようになります。

db.collection.mapReduce(
    map,
    reduce,
    {
        out: { inline: 1 },
        query: // your range query
        sort: // by created_at
        scope: { GenerateID: GenerateID },
    }
)

公式の MongoDB の map/reduce の概要は次のとおりです。

http://docs.mongodb.org/manual/applications/map-reduce/

于 2013-03-19T09:45:50.047 に答える