在mongo中需要使用Identity列连接两个集合,并从两个集合中发出所需的列

时间:2012-09-27 06:36:03

标签: mongodb mapreduce

我有书和作者集合。这个名称和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'}})

有人可以帮助我吗?

1 个答案:

答案 0 :(得分:0)

从查看代码看,您似乎有两个集合,“book”和“author”。每本书的结构都是

{
    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()应该有效。

如果我误解了,你到底想要做什么?