将Schema _id设置为false的Mongoose findOneAndUpdate

时间:2017-09-28 02:46:24

标签: javascript node.js mongodb mongoose mongoose-schema

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

我正在寻找一种更有效的方法来实现这一点,从阅读文档 - 我拼凑了以下(我也使用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作为我的独特钥匙。

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

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

0 个答案:

没有答案