私は比較的NoSQLですが、私は非常に楽しんでいます!私はしかし、地図を減らす方法を見つけるのは少し難しいです!私は問題の助けが必要です!CouchDBはペア文書を検索し、残りのペアのない文書を一覧表示します
私は、オープントランザクションとクローズトランザクションという2種類のドキュメントを持つデータベースを持っています。レプリケーションとオフライン機能のために、はを1つのドキュメントにマージできません。オープニングトランザクション文書は次のようになります。
終値取引のrandomgeneratedstring
{
_id: "transaction-close-randomgeneratedstring",
type: "transactions-close",
openid: "transaction-open-randomgeneratedstring",
created: "date string"
}
は、対応する開口トランザクションのrandomgeneratedstring
と一致:
{
_id: "transaction-open-randomgeneratedstring",
type: "transactions-open",
vehicle: "vehicle-id",
created: "date string"
}
決算書類をようになります。
私は私に対応するクロージングトランザクションを持っていない開いているトランザクションのリストを与えるためにマップが-減らす必要があります。これは、基本的に私に未払いの取引のリストを与えます。
これは私がこれまで行ってきたマップリダクションですが、それは仕事をしていません。
{
"map": function(doc) {
if(doc.type == "transactions-open") {
emit([doc._id, 0], "OPEN");
}
if(doc.type == "transactions-close"){
emit([doc.openid, 1], "CLOSE");
}
},
"reduce": function(keys, values, rereduce) {
var unique_labels = {};
var open = {};
keys.forEach(function(label) {
if(!unique_labels[label[0]]) {
unique_labels[label[0]] = true;
} else {
open[label[0]] = true;
}
});
return open;
}
}
私は_idの命名/構造の変化のために開いていますが、私は一つに二つの文書を組み合わせることはできません。
ありがとうございます! 、これは確かに正しい方向への一歩ですが、不要なトランザクションは、結果セットに残っている
function(keys, values, rereducer)
{
if(values.length == 1)
return true;
}
:
EDIT はホッドからの応答に基づいて、私が見えるように削減を変更しました値はnullのみです。結果セットからそれらを取得する方法はありませんか?
ありがとうございました!あなたはreduce関数の仕組みについて多くの光を放っています!私の地図では、openのdoc._idとclosedのdoc.openidは同じです。レベル1でグループ化すると、両方の取引が減額されますか?キーの長さが1より大きいインスタンスの場合、私がreduceで何も返さないとどうなりますか? – monkeyman
はい、レベル1でグループ化すると、完了したトランザクションの2つのドキュメントを1回の短縮コールにバンドルする必要があります。何も返さないか、長さ0の配列が使えます。 – Hod