猫鼬model.update和model.findOneAndUpdate并未实际更新

时间:2018-10-11 01:39:39

标签: node.js mongodb mongoose

model.updatemodel.findOneAndUpdate实际上不执行更新,即使它们与文档匹配。

我一定会失去理智,因为其他人肯定会看到这么大的问题。 (这是我在进行更多测试后提交的先前帖子的简化版)。

我已经能够使用Mongoose的多个版本(4.0.7和5.3.2)和Node(v8和v10)以及在两个完全不同的环境(Ubuntu 16.04和Windows 10)中复制一个版本, Node.js文件:

const mongoose = require('mongoose');
mongoose.set('debug',true);
mongoose.connect('mongodb://localhost/db',{useNewUrlParser: true});
console.log(mongoose.version);
const model = mongoose.model(
  'tests',
  new mongoose.Schema({hello:String})
);
const test = new model({hello:'world'});
test.save(()=>{
  model.count({},(err,count)=>{
    console.log(count);
    model.findOneAndUpdate({},{dummy:true},{new:true},(updateErr,doc)=>{
      console.log(doc);
    });
  });
});

运行此命令的结果是:

5.3.2
Mongoose: tests.insert({ hello: 'world', _id: ObjectId("5bbea605cb4a882433725bfe"), __v: 0 })
Mongoose: tests.count({}) {}
6
Mongoose: tests.findOne({ dummy: { '$ne': true } }) { new: true, fields: undefined }
{ _id: 5bbe9f7c5362642220dde2d7, hello: 'world', __v: 0 }

无论我使用update还是findOneAndUpdate都不会真正发生更新,即使搜索文档为空的{}也是如此。较高的计数是由于多次运行。我可以在mongo shell中直接运行update命令,而不会遇到麻烦,并且可以通过shell确认没有任何更新。

有人可以复制吗?也许是全新安装的猫鼬?我只是对某事感到愚蠢吗?

1 个答案:

答案 0 :(得分:1)

感谢Mongoose GitHub上的优秀人才,我得到了the answer

简而言之:猫鼬不运行更新,因为它们只会影响架构中未定义的字段。

更长的时间:在strict模式下(默认),如果您使用仅影响架构中未包含的字段的更新查询,则该查询将转换为find或类似查询,或者什么也没做。即使对未在架构中指定的字段执行$unset操作,也是如此。在将该字段从我的架构中删除后,尝试从文档中删除该字段时遇到了这种情况,然后在我的最小示例中,该字段很笨,没有在架构中包含dummy字段。