Node.js Can';不要更改Mongoose字段类型,除非原值

Node.js Can';不要更改Mongoose字段类型,除非原值,node.js,mongodb,mongoose,Node.js,Mongodb,Mongoose,我的myId字段是一个字符串。我想将其转换为数字,所以我运行了这个(在将我的Mongoose模型字段更新为Number之后): 然而,这是行不通的myId在MongoDB Compass中仍然是一个字符串 仅当我更改值时,它才起作用: Post.find( { myId : { $exists : true } }).then( function(docs){ docs.forEach(function (doc) { doc.myId = parseInt(doc.myId) +

我的
myId
字段是一个字符串。我想将其转换为数字,所以我运行了这个(在将我的Mongoose模型字段更新为
Number
之后):

然而,这是行不通的
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=wait Post.find({myId:{$exists:true});
等待承诺。全部(docs.map)((doc)=>{
修改文件标记(“myId”);
返回单据保存();
}));

如果我不得不猜测,那是因为Mongoose将MongoDB中的数据强制为Mongoose所期望的类型。如果执行
console.log(typeof doc.myId)
,将打印什么?可能是“数字”。由于number的parseInt是相同的数字,所以Mongoose不会检测到更改,因此它不会保留对数据库的类型更改。我相信c1moore是正确的,所以Mongoose会检测到字段值的任何更改,我猜仅仅是字段类型的变化,比如值没有变化,但是它的类型可能不会被检测到。。好吧,不管怎样,让我们忘掉读写这一问题,您的MongoDB版本是什么?OP已经声明模式已更新(“将我的Mongoose模型字段更新为数字后”),这也是Mongoose将字符串从DB转换为数字的原因。
// This works!
doc.myId = parseInt(doc.myId) + 1;
doc.myId = doc.myId - 1;
doc.save();