gpt4 book ai didi

node.js - 当我使用 mongodb 的 findOneAndUpdate 方法时,为什么 mongodb 会更改 _id ?

转载 作者:太空宇宙 更新时间:2023-11-03 21:49:23 24 4
gpt4 key购买 nike

我来自关系数据库,而主键(本例中为 _id)在其生命周期中是相同的,因此当我在 mongodb 中看到这种行为时,我感到很惊讶。

我按以下方式使用 Mongoose 的 findOneAndUpdate 插件方法:

                     User.findOneAndUpdate(
{ "products._id": _id, "_id": req.payload._id },
{
"$set": {
"products.$": {name: "New name"}

}
},
{
new: true ,
runValidators: true
},
function (err, doc) {
if (err != null) {
res.status(500).json({ message: "Error on updating. Please, try again later." });
} else if (doc == null) {
res.status(404).json({ message: "Product not found." });
} else {
res.status(200).json(doc.products)
}
}
);

开始之前:

{_id: 58b5e637f9f904a800721abf, name: "Old name"}

(_id 更改)之后:

{_id: 58b5e35a7f4ff38c433a5bc9, name: "New name"}

我只想在更新后保留相同的 _id,因为我认为当我实现同步更新时可能会遇到麻烦。

我搜索了一下,发现这个 mongoose 方法对于 mongo 的驱动程序来说是直接调用的,不需要中间件。因此,我想这个问题可以由 mongodb 专家在没有 mongoose 知识的情况下解决。

最佳答案

_id 附加到文档修订版,而不是文档实体。

通过传递new: true,您要求 Mongo 返回最新版本的 id,该版本的 id 与原始文档 (Upsert) 不同。

对于基于文档的存储,建议实现您自己的 UUID 架构。

要么使用 uuid 进行确定性处理:

var UUID = require('uuid-1345');

UUID.v3({
namespace: UUID.namespace.oid,
name: "abc" // Some formula to calculate you uuid, could be based on the document's legacy id or some other unique identifier.
}, function (err, id) {
console.log("Generated a name-based UUID using MD5:\n\t%s\n", id);
});

或者使用普通随机十六进制随机:

var crypto = require('crypto');

var id = crypto.randomBytes(20).toString('hex');

将此包含在文档正文中...并且不要忘记 index它!

关于node.js - 当我使用 mongodb 的 findOneAndUpdate 方法时,为什么 mongodb 会更改 _id ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42519084/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com