さまざまな独自のソースからステータスの更新を受け入れるシステムがあり、ステータスの更新ごとに次の構造で新しいドキュメントが作成されます。
{
"type": "status_update",
"source_id": "truck1231",
"timestamp": 13023123123,
"location": "Boise, ID"
}
データは純粋に例ですが、アイデアを理解します。
現在、これらのドキュメントは 1 時間に 1 回程度の間隔で生成されます。1 時間後、次のように挿入します。
{
"type": "status_update",
"source_id": "truck1231",
"timestamp": 13023126723,
"location": "Madison, WI"
}
私が興味を持っているのは、それぞれの独自のソースからの最新の更新を見ることだけです。現在、次のマップを取得してこれを行っています。
function(doc) {
if (doc.type == "status_update") {
emit(doc.source_id, doc);
}
}
そして以下の削減:
function(keys, values, rereduce) {
var winner = values[0];
var i = values.length;
while (i--) {
var val = values[i];
if (val.timestamp > winner.timestamp) winner = val;
}
return winner;
}
そして、reduce でデータをクエリしますgroup=true
。これは期待どおりに機能し、最新の更新のみのキー付き結果を提供します。
問題は、それが非常に遅くreduce_limit=false
、CouchDB の設定を変更する必要があることです。
これを行うためのより効率的な方法が必要であると感じています。同じドキュメントを更新するという選択肢はありません。今回は必要ありませんが、履歴は重要です。これはCouchAppであり、システム内のドキュメントの量は実際には非常に大きく、それらをネットワーク全体に送信するのは現実的ではないため、クライアント側でデータを処理することもできません。
前もって感謝します。