Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MongoDB mapReduce函数不是';I don’’它不能正常工作_Mongodb_Mapreduce_Mongodb Query - Fatal编程技术网

MongoDB mapReduce函数不是';I don’’它不能正常工作

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

我在我的两个系列上运行以下内容,分别命名为“玩家”和“药房”

我想加入他们的objectId的
\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})