MongoDB findAndModify 返回 null

Posted

技术标签:

【中文标题】MongoDB findAndModify 返回 null【英文标题】:Mongo findAndModify returns null 【发布时间】:2015-11-18 23:48:33 【问题描述】:

Following.follow = function(id1, id2, cb) console.log(id1) // 返回马特 console.log(id2) // 返回 Simone

  Following.collection.findAndModify(
      query: 
          ownerId: id1
      ,
      update: 
          $addToSet: 
              followedBy: id2
          
      ,
      upsert: true,
      new: true
  , function(err, result, lastErrorObject) 
      cb(err, result)
      console.log(result) // returns null
  )

我正在使用 Mocha 运行测试,而我的 findAndModify 函数只会返回 null。我阅读了文档,似乎无法弄清楚我做错了什么。如果找不到,则 Upsert 与 true 结合应该生成文档,并且 new 应该返回修改后的对象。

【问题讨论】:

您在 cb 之后调用了 console.log... 如果交换最后两行会发生什么? console.log(result); cb(err, result); 【参考方案1】:

看起来这在很多方面都是错误的:

首先,这里的.findAndModify() 语法对任何node.js 驱动程序都无效,您可能指的是.findOneAndUpdate()

  Following.collection.findOneAndUpdate(
     "ownerId": id1 , 
     "$addToSet":  "followedBy": id2  ,
     
      "upsert": true,
      "returnOriginal": false
    ,
    function(err, result) 
      console.log(result);   // if you don't call before the callback it never gets called.
      cb(err, result);
    
  );

第二种情况是.collection 暗示这是来自“猫鼬”,所以使用猫鼬的本机方法代替.findOneAndUpdate()

  Following.findOneAndUpdate(
     "ownerId": id1 , 
     "$addToSet":  "followedBy": id2  ,
     
      "upsert": true,
      "new": true
    ,
    function(err, result) 
      console.log(result);   // if you don't call before the callback it never gets called.
      cb(err, result);
    
  );

如果您要传递需要大小写为 ObjectId 之类的字符串并且您没有手动处理该字符串,那么最后一个可能是您想要的。猫鼬处理这个。本机驱动程序不会为您执行此操作,因为它没有“模式”可以参考来计算“类型转换”。

所以使用应该支持的方法。

【讨论】:

以上是关于MongoDB findAndModify 返回 null的主要内容,如果未能解决你的问题,请参考以下文章

Mongoose 是不是支持 Mongodb `findAndModify` 方法?

Mongodb update() 与 findAndModify() 性能对比

Mongodb 关于update和findAndModify

NodeJS 和 MongoDB FindAndModify() 需要删除或更新

Mongodb在多个匹配中的特定文档上使用findAndModify

pymongo:findandmodify - 返回“没有这样的命令”