通常,我会搜索/查找文档 . 如果找到一个文档,那么我会更新它...如果没有找到,那么我会创建它 .

我正在寻找一种更有效的方法,通过阅读文档 - 我拼凑了以下(我也使用hapi.js)

const Schema = mongoose.Schema;

    let ProductSchema = new Schema({
        sku: String,
        active: Boolean,
        category: String,
        description: String,
        freeShipping: Boolean
    });

.... ProductSchema是导出的,并且需要作为'Products'..它用于创建新产品 . 我传递了我的有效载荷(已通过Joi验证) .

let product = new Products(request.payload);

        Products.findOneAndUpdate(
            { sku : request.payload.sku }, 
            {$set: product },
            { upsert: true,  new: true, runValidators: true },
            function(err, result) {
            if (err) {
                console.error(err);
                return reply(Boom.badRequest('Error saving product'));
            }

            return reply(result); 

        });
  • upsert:true - 如果找不到则表示创建 .

  • new:true - 返回新创建或更新的文档(结果)

  • runValidators:true - 应强制对架构验证数据(产品) .

但是,我遇到了实例化产品的问题 - Mongoose会自动插入“_id” .

“_ids”是不可变的 . 所以当我尝试更新时,我收到以下错误:

{ MongoError: After applying the update to the document {_id: ObjectId('59cc33812e36f3d0272dc28e') , ...}, the (immutable) field '_id' was found to have been altered to _id: ObjectId('59cc3c21e0938d99c2716989')

所以,我的第一个想法是 - 使用文字符号创建对象...然后我可以控制省略“_id”...

但是,这样做意味着对象不是由架构创建/验证的......

然后我读到你可以通过在模式中将_id设置为false来禁止创建_id . 我做了这个,现在得到一个没有_id验证的对象 . 现在更新/创建工作而不会抛出错误 .

抑制我的模式中的“_id”字段似乎不是什么大问题,因为Mongo服务器将始终为每个条目创建一个新的_id . 我正在使用SKU作为我的独特钥匙 .

但是,我注意到我是通过四处寻找并试图解决问题来到这里的 .

所以问题的核心是 - 我的方法有缺陷吗?