gpt4 book ai didi

node.js - Mongoose - 带有 $set 标志的 findOneAndUpdate

转载 作者:可可西里 更新时间:2023-11-01 09:20:10 24 4
gpt4 key购买 nike

考虑这个命令:

    WorkPlan.findOneAndUpdate({ _id: req.params.id }, updateObj, function(err) {
...
})

与此相对:

    WorkPlan.findOneAndUpdate({ _id: req.params.id }, { '$set': updateObj }, function(err) {
...
})

在开发我的项目时,我惊讶地发现第一个命令的结果与第二个命令的结果相同:updateObj 被合并到数据库中的现有记录中,即使在第一种情况下应该更换它。这是 mongoose/mongodb 中的错误还是我做错了什么?如何在更新时替换对象而不是合并它?我正在使用 Mongoose 4.0.7。

谢谢。

==========

更新:

这是实际的 WorkPlan 架构定义:

workPlanSchema = mongoose.Schema({
planId: { type: String, required: true },
projectName: { type: String, required: true },
projectNumber: { type: String, required: false },
projectManagerName: { type: String, required: true },
clientPhoneNumber: { type: String, required: false },
clientEmail: { type: String, required: true },
projectEndShowDate: { type: Date, required: true },
segmentationsToDisplay: { type: [String], required: false },
areas: [
{
fatherArea: { type: mongoose.Schema.ObjectId, ref: 'Area' },
childAreas: [{ childId : { type: mongoose.Schema.ObjectId, ref: 'Area' }, status: { type: String, default: 'none' } }]
}
],
logoPositions: [
{
lat: { type: Number, required: true },
lng: { type: Number, required: true }
}
],
logoPath: { type: String, required: false },
}, { collection: 'workPlans' });


WorkPlan = mongoose.model('WorkPlan', workPlanSchema);

这是 updateObj 的一个例子:

    var updateObj = {
projectManagerName: projectManagerName,
clientEmail: clientEmail,
clientPhoneNumber: clientPhoneNumber,
segmentationsToDisplay: segmentationsToDisplay ? segmentationsToDisplay.split(',') : []
}

因此,当我不使用 $set 标志时,我希望字段 projectNumber 不存在于新记录中,但我看到它仍然存在。

最佳答案

Mongoose 更新将所有顶级键视为 $set 操作(这在旧文档中更清楚:Mongoose 2.7.x update docs)。

为了获得您想要的行为,您需要将overwrite 选项设置为true:

WorkPlan.findOneAndUpdate({ _id: req.params.id }, updateObj, { overwrite: true }, function(err) {
...
})

参见 Mongoose Update documentation

关于node.js - Mongoose - 带有 $set 标志的 findOneAndUpdate,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38405989/

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