gpt4 book ai didi

node.js - Mongoose $push 不断添加两个条目

转载 作者:IT老高 更新时间:2023-10-28 13:21:28 26 4
gpt4 key购买 nike

这是我的 userproduct 架构:

const productSchema = new Schema({
//...
addedBy: {
type: mongoose.Schema.Types.ObjectId,
ref: "users"
}
});

const userSchema = new Schema({
//...
addedItems: [{
type: mongoose.Schema.ObjectId,
ref: "products"
}]
});

mongoose.model("products", productSchema);
mongoose.model("users", userSchema);

在我的 Node 后端路由中,我执行以下查询:

User.findOneAndUpdate(
{ _id: req.body.id },
{ $push: { addedItems: newProduct._id } },
{ upsert: true, new: true },
function(err, doc) {
console.log(err, doc);
}
);

console.log 打印出这个:

{
//...
addedItems: [ 5ab0223118599214f4dd7803 ]
}

一切看起来都不错。我去使用我的 mongo db 的前端网站实际查看数据;我正在使用 mlab.com ,这就是显示的内容:

{
//...
"addedItems": [
{
"$oid": "5ab0223118599214f4dd7803"
},
{
"$oid": "5ab0223118599214f4dd7803"
}
]
}

问题:到底发生了什么?为什么它会在 addedItems 中添加一个额外的条目?!即使我的 console.log 只显示了一个。

注意:

我测试了后端路由是否被多次调用。它不是。

这似乎是 $push 的问题,因为如果我只有 { addedItems: newProduct._id } 那么只有一个条目进入,但它会覆盖整个数组。

编辑:

制作了一个测试项目以产生相同的结果:https://github.com/philliprognerud/test-mcve-stackoverflow

谁能弄清楚发生了什么?

最佳答案

问题是由于您混合使用了 Promise(通过 async/await)和带有 findOneAndUpdate 调用的回调,最终执行了两次命令。

解决问题:

const updatedUser = await User.findOneAndUpdate(
{ id: userID },
{ $push: { addedItems: newProduct.id } },
{ upsert: true, new: true }
);

console.log(updatedUser);

future 的读者请注意,问题中没有显示 await 的使用,而是在 MCVE 中。

关于node.js - Mongoose $push 不断添加两个条目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49372428/

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