0

我有书和作者收藏。这个名字和works_written分别是相同的值列。所以我尝试了以下脚本,但它只发出第一个地图值,第二个地图值没有发出。

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

通过查看您的代码,您似乎有两个集合,“书”和“作者”。每本书的结构如下

{
    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 回答