gpt4 book ai didi

node.js - MongoDB Node native 驱动程序创建重复文档

转载 作者:可可西里 更新时间:2023-11-01 10:00:58 26 4
gpt4 key购买 nike

当我使用 mongodb-native-driver 保存对文档的更新时,我得到了一个重复的文档。我对 save() 的第一次调用正确地创建了文档并添加了一个带有 ObjectID 值的 _id。第二次调用使用原始 ObjectID 的文本 _id 创建一个新文档。例如,我最终得到:

> db.people.find()
{ "firstname" : "Fred", "lastname" : "Flintstone", "_id" : ObjectId("52e55737ae49620000fd894e") }
{ "firstname" : "Fred", "lastname" : "Flintstone with a change", "_id" : "52e55737ae49620000fd894e" }

我的第一个电话正确地创建了 Fred Flinstone。在姓氏中添加“with a change”的第二个调用创建了第二个文档。

我正在使用 MongoDB 2.4.8 和 mongo-native-driver 1.3.23。

这是我的 NodeJS/Express 端点:

app.post("/contacts", function (req, res) {
console.log("POST /contacts, req.body: " + JSON.stringify(req.body));

db.collection("people").save(req.body, function (err, inserted) {
if (err) {
throw err;
} else {
console.dir("Successfully inserted/updated: " + JSON.stringify(inserted));
res.send(inserted);
}
});
});

这是运行时日志消息:

POST /contacts, req.body: {"firstname":"Fred","lastname":"Flintstone"}
'Successfully inserted/updated: {"firstname":"Fred","lastname":"Flintstone","_id":"52e55737ae49620000fd894e"}'
POST /contacts, req.body: {"firstname":"Fred","lastname":"Flintstone with a change","_id":"52e55737ae49620000fd894e"}
'Successfully inserted/updated: 1'

为什么我的第二个不更新现有记录?驱动程序不会将 _id 值转换为 ObjectID 吗?

最佳答案

您第二次回发的内容包含一个名为“_id”的字段,它是一个字符串。这就是问题所在。

看文档,什么save method做的是一个“简单的全文档替换功能”。我不经常使用这个函数 quit 所以这就是我的猜测。该函数使用 _id 字段查找文档,然后将整个文档替换为您提供的内容。但是,您提供的是一个字符串 _id。显然它不等于 ObjectId。我认为您应该在传递给函数之前将其包装到 ObjectId。

另外,根据文档不推荐保存方式。你应该使用 update (也许有 upsert 选项)而不是

关于node.js - MongoDB Node native 驱动程序创建重复文档,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21367885/

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