Mongo $ set函数正在重置默认值

时间:2018-11-14 10:34:05

标签: mongodb mongoose

我在MongoDB中具有以下集合:

shop: {
    products: [{
     (...)
        _id: {
            type: mongoose.Schema.Types.ObjectId,
            ref: 'Product',
            unique: true
        },
        dateAdded: {
            type: Date,
            default: Date.now,
            required: true
        },
        dateModified: {
            type: Date,
            default: Date.now,
        },
    }]
}

根据它们的名称,其中包含产品创建的日期和产品的更新日期。

我正在更新这样的产品:

Shop.findOneAndUpdate({
    _id: shopId,
    "products._id": prod._id
},
{
    "$set": {
        "products.$": prod
    }
},
{
    new: true,
    upsert: true
})

'prod'并不包含产品的所有字段,因此我使用$ set仅保存我提供的字段,而不是清除这些字段。

'prod'确实包含_id字段和dateModified值,但不包含dateAdded,但是该字段实际上是使用Date.now值更新的,这导致该dateAdded和dateModified始终具有相同的值。

我该如何解决? dateAdded仅在他为空时才可以填充,但是由于我在这里进行更新,因此可以假定该字段有一个值。

编辑重复标记 这个问题与_id字段无关,它工作正常,只是为了使这个问题更清楚而添加。关于另一个字段(dateAdded)的默认值

编辑2

按照标记的问题,我将查询更改为此:

Shop.update({
    _id: shopId,
    "products._id": prod._id
},{
    "$set": {
        "products.$": prod
    }
},{
    new: true
})

因此,我将findOneAndUpdate()更改为update()并删除了upsert:true选项,但是dateCreated仍然用date.now()更新。我错过了什么吗?

0 个答案:

没有答案