通常,我会搜索/查找文档。如果找到了文档,那么我会更新它...如果没有找到,那么我会创建它。
我正在寻找一种更有效的方法来实现这一点,从阅读文档 - 我拼凑了以下(我也使用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);
});
但是,我遇到了实例化产品的问题 - 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作为我的独特钥匙。
然而,我注意到我是通过四处寻找并试图解决问题来到这里的。
所以问题的核心是 - 我的做法有缺陷吗?