model.update
和model.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确认没有任何更新。
有人可以复制吗?也许是全新安装的猫鼬?我只是对某事感到愚蠢吗?
答案 0 :(得分:1)
感谢Mongoose GitHub上的优秀人才,我得到了the answer。
简而言之:猫鼬不运行更新,因为它们只会影响架构中未定义的字段。
更长的时间:在strict
模式下(默认),如果您使用仅影响架构中未包含的字段的更新查询,则该查询将转换为find
或类似查询,或者什么也没做。即使对未在架构中指定的字段执行$unset
操作,也是如此。在将该字段从我的架构中删除后,尝试从文档中删除该字段时遇到了这种情况,然后在我的最小示例中,该字段很笨,没有在架构中包含dummy
字段。