【问题标题】:Mongodb findOneAndUpdate function is inserting new documentMongodb findOneAndUpdate 函数正在插入新文档
【发布时间】:2018-03-05 09:34:59
【问题描述】:

每当我进行更新 api 调用时,我只需要更新 serviceActiveFlag 状态。在更新 api 调用之后,我可以看到创建了一个带有空车辆数组的新文档,如下所示。

_id:59c76073c11d3929148f500f
vehicle:Array
_v:0

id 字段将覆盖每个 put api 调用。

谁能帮我解决这个问题?

架构

var localTransportSchema = new Schema({

        name: { type: String, required: false, trim: true },
        contact: {
            addressLine1: { type: String, required: false },        
            serviceActiveFlag: { type: String, required: false, enum: ['Y', 'N'] },
    }, 
    vehicle: [{
        vehicleType:{ type: String, required: false, enum: ['sedan', 'hatchback', 'suv', 'mpv', 'luxury'] },        
    }]
});
module.exports.accomodationModel = mongoose.model(collection, localTransportSchema);

控制器

var updates = {
            $set: {
                "contact.addressLine1": req.body['addressLine1'],                
                "contact.serviceActiveFlag": req.body['serviceActiveFlag']
            }
    };

    transportModel.findOneAndUpdate({ "name": req.body['providerName']},
        updates, { returnOriginal: false, upsert: false }, function (err, doc) {
            if (err) {
                logger.error("Error while updating record : - " + err.message);
                return res.status(409).json({
                    "Message": "Error while updating transport details for provider " + req.body['providerName'] + " in transport details table"
                });
            } else if (doc === null) {
                logger.error("Error while updating record in transport details : - unable to update database");
                return res.status(409).json({
                    "Message": "Error while updating transport details for provider " + req.body['providerName'] + " due to " + err.message
                });
            }
        });

【问题讨论】:

  • 你用的是什么版本的猫鼬?查询完成时回调中doc的输出是什么。
  • 我正在使用 4.11.11.Doc 返回更新后的文档。
  • 您确定没有其他操作添加不需要的文档吗?此外,findOneAndUpdate 没有将returnOriginal 列为选项
  • 是。没有其他操作正在添加不需要的文档
  • 我对猫鼬并不完全熟悉,但这可能是您的出口问题吗?在您的架构中,您正在导出 accomodationModel,但您的控制器正在引用 transportModel

标签: javascript node.js mongodb mongoose


【解决方案1】:

dbModel.findOneAndUpdate() 的 mongoose 仅​​在您的过滤器查询(where claus)未能找到现有文档时插入新文档,即您的集合中不存在匹配的文档。 所以猫鼬会将新文档插入到集合中。这类似于upsert:trueupdate()

参考:Official docs about findOneAndUpdate

【讨论】:

    猜你喜欢
    • 2022-08-02
    • 2016-10-15
    • 2019-03-06
    • 1970-01-01
    • 1970-01-01
    • 2017-01-27
    • 2022-11-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多