0

私は本と著者のコレクションを持っています。この名前とworks_writtenはそれぞれ同じ値の列です。したがって、次のスクリプトを試しましたが、最初のマップ値のみを出力し、2番目のマップ値は出力されません。

book = function() {
emit(this.id, {name: this.name,editions:this.editions});
 }
author = function() {
emit(this.id, {name:this.name,works_written: this.works_writtten,});
 }


r_b = function(k, values) {
var result = {};
values.forEach(function(value) {
    var name;
    for (name in value) {
        if (value.hasOwnProperty(name)) {
             result[name] = value[name];
        }
    }
 });
 return result;
 };
 r_a = function(k, values) {
 var result = {};
 values.forEach(function(value) {
    var works_written;
    for (works_written in value) {
        if (value.hasOwnProperty(works_written)) {
            result[works_written] = value[works_written];
         }
     }
 });
 return result;
 };
  res = db.book.mapReduce(book, r_ja, {out: {reduce: 'joined'}})
  res = db.author.mapReduce(author, r_jp, {out: {reduce: 'joined'}})

誰かが私を助けることができますか?

4

1 に答える 1

0

コードを見ると、「book」と「author」の 2 つのコレクションがあるようです。各本は次のように構成されています。

{
    id: <some id>,
    name: <some name>,
    editions: <comma-separated string of editions>
}

そして、各著者は次のように構成されています

{
    id: <some id>,
    name: <some name>,
    works_written: <comma-separated string of works written>
}

カンマ区切りのリストを個別の文字列にまとめて格納するよりも、works_written と editions の両方を配列として格納する方が合理的です。これにより、配列の反復処理が可能になります。

また、著者ごと、本ごとに複数のドキュメントがありますか? そうでない場合は、やろうとしていることを行うために mapreduce は必要ありません。単純な find() が機能するはずです。

私が誤解している場合に備えて、あなたは正確に何をしようとしていますか?

于 2012-09-27T16:07:39.217 に答える