最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

除非更改猫鼬字段类型,否则它就等于原始值

网站源码admin20浏览0评论

除非更改猫鼬字段类型,否则它就等于原始值

除非更改猫鼬字段类型,否则它就等于原始值

我的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();
}));
发布评论

评论列表(0)

  1. 暂无评论