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



我有book和author集合。在这个名称中,works_writen分别是相同的值列。所以我尝试了以下脚本,但它只发出第一个映射值,不发出第二个映射值。

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'}})

有人能帮我吗?

从您的代码来看,您似乎有两个集合,"book"one_answers"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_writen和editions都存储为数组,而不是将逗号分隔的列表分别打包到一个单独的字符串中。这将使对数组进行迭代成为可能。

此外,您是否为每个作者和每本书都有多个文档?如果没有,您就不需要mapreduce来做您想要做的事情——一个简单的find()应该可以工作。

万一我误解了,你到底想做什么?

最新更新