字段类型,否则它就等于原始值"/>
除非更改猫鼬字段类型,否则它就等于原始值
我的myId
字段是一个字符串。我想将其转换为Number,所以我运行它(将Mongoose模型字段更新为Number
之后):
Post.find( { myId : { $exists : true } }).then( function(docs){
docs.forEach(function (doc) {
doc.myId = parseInt(doc.myId);
doc.save();
})
})
但是,这不起作用! myId
在MongoDB Compass中仍然是一个字符串。
仅在更改值时有效:
Post.find( { myId : { $exists : true } }).then( function(docs){
docs.forEach(function (doc) {
doc.myId = parseInt(doc.myId) + 1000; // => This is the only way I can change the field type to Number! What gives?
doc.save();
})
})
为什么我必须更改值才能更改字段类型?
编辑
如果在保存之前更改了该值,它也可以起作用:
// This works!
doc.myId = parseInt(doc.myId) + 1;
doc.myId = doc.myId - 1;
doc.save();
回答如下:这可能是因为Mongoose将尝试将存储在MongoDB中的类型强制为Mongoose期望的类型。这意味着字符串已经被转换为数字,因此当您将myId
设置为parseInt()
的值时,Mongoose不会检测到任何更改,因为解析整数值会返回相同的整数。
最简单的方法是将字段标记为已修改,所以这样(未测试):
const docs = await Post.find( { myId : { $exists : true } });
await Promise.all(docs.map((doc) => {
doc.markModified('myId');
return doc.save();
}));
更多推荐
除非更改猫鼬字段类型,否则它就等于原始值
发布评论