MongoDB mapReduce函数不是';I don’’它不能正常工作
我在我的两个系列上运行以下内容,分别命名为“玩家”和“药房” 我想加入他们的objectId的MongoDB mapReduce函数不是';I don’’它不能正常工作,mongodb,mapreduce,mongodb-query,Mongodb,Mapreduce,Mongodb Query,我在我的两个系列上运行以下内容,分别命名为“玩家”和“药房” 我想加入他们的objectId的\u id和药房的比如objectId(“1287943s76a87flkl2”) 我遇到的问题是,当我运行mapReduce函数时,第一个函数将其行输出到“联接”集合,第二个函数也将其行输出到“联接”集合 在新的“join”集合中,我只想看到它找到join的数据。目前,它正在将两个集合中的所有数据都放入其中,我不想要这些数据,只想要具有完整数据的行 //Merge data so it outputs
\u id
和药房的比如objectId(“1287943s76a87flkl2”)
我遇到的问题是,当我运行mapReduce函数时,第一个函数将其行输出到“联接”集合,第二个函数也将其行输出到“联接”集合
在新的“join”集合中,我只想看到它找到join的数据。目前,它正在将两个集合中的所有数据都放入其中,我不想要这些数据,只想要具有完整数据的行
//Merge data so it outputs a complete row of data from the reduce function, no rows should appear if they don't have all the data
player_map = function() {
emit(this.pharmacy, {"firstname" : this.first_name, "lastname" : this.last_name, "email" : this.email});
}
pharma_map = function() {
emit(this._id, {"name" : this.name, "country" : this.country});
}
r = function(key, values) {
var result = {
"firstname" : "",
"lastname" : "",
"email" : "",
"name" : "",
"country" : ""
};
values.forEach(function(value) {
if(value.firstname !== null) {result.firstname = value.firstname;}
if(value.lastname !== null) {result.lastname = value.lastname;}
if(value.email !== null) {result.email = value.email;}
if(value.name !== null) {result.name = value.name;}
if(value.country !== null) {result.country = value.country;}
});
return result;
}
res = db.players.mapReduce(player_map, r, {out: {reduce : 'joined'}});
res = db.pharmacies.mapReduce(pharma_map, r, {out: {reduce : 'joined'}});
玩家文档
{
__v: 3,
_id: ObjectId("552496ea6215d31100fa1d984"),
activation_code: 5633,
country: "AU",
createdAt: ISODate("2015-04-08T02:48:10.491Z"),
email: "me@example.com",
first_name: "John",
password: "57467845742675427",
pharmacy: ObjectId("5521d924847351c8243256")
}
{
name: "Test Pharmacy",
_id: ObjectId("5521d924847351c8243256"),
products: [],
country: "AU",
createdAt: ISODate("2015-04-06T00:53:56.166Z"),
__v: 0
}
药房文件
{
__v: 3,
_id: ObjectId("552496ea6215d31100fa1d984"),
activation_code: 5633,
country: "AU",
createdAt: ISODate("2015-04-08T02:48:10.491Z"),
email: "me@example.com",
first_name: "John",
password: "57467845742675427",
pharmacy: ObjectId("5521d924847351c8243256")
}
{
name: "Test Pharmacy",
_id: ObjectId("5521d924847351c8243256"),
products: [],
country: "AU",
createdAt: ISODate("2015-04-06T00:53:56.166Z"),
__v: 0
}
我也试过了,虽然它在新合并的集合中插入了country和name字段,但它没有插入这两个字段的数据
db.players.find().forEach(function(pl) {
pharmacies=db.pharmacies.find({_id:pl.pharmacy});
pl.pharmacy_name=pharmacies.name;
pl.pharmacy_country=pharmacies.country;
db.merged.insert(pl);
});
这是正常的,如果您只想输出存在联接的数据,那么在第二个mapreduce作业中添加一个finalize函数,您可以在其中检查联接的两个部分是否都存在并输出结果。@nickmilon是的,我刚刚阅读了finalize()
上的文档,尽管我似乎无法获得它。您是否有可能提供一个以上修订版本的答案?挣扎:/抱歉,我想我弄错了,finalize只能转换简化集合中的文档,而您打算排除文档,如果这是您的意图,为什么不对简化集合执行.remove({field_name:{$exists:false}}})操作?db.joined.remove({$and:[{field1:{$exists:false}},{field2:{$exists:false}…]))@刚刚从集合中删除了所有文档,而不是只删除没有所有字段的文档的nickmilon://无法使用命令写入模式,降级为兼容模式WriteResult({“nRemoved”:6682})