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

编程入门 行业动态 更新时间:2024-10-07 10:16:06

除非更改猫鼬<a href=https://www.elefans.com/category/jswz/34/1771443.html style=字段类型,否则它就等于原始值"/>

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

我的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();
}));

更多推荐

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

本文发布于:2024-05-07 05:18:45,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1754464.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:字段   它就   原始   类型

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!