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