この場合、マングースを使用したいと思います。Mongodb/Mongooseのサブ文書を使用した詳細更新の処理方法
const userSchema = new Schema({
name: {
first: { type: String, required: true },
last: { type: String, required: true },
},
email: { type: String, required: true, unique: true, lowercase: true },
});
すでに姓と名のドキュメントがあるとします。私は、オブジェクトには、次の引数でのみ最初の名前とメールアドレスを更新する必要があります。
const updateUser = {
name: {
first: Eddy,
},
email: '[email protected]'
};
またnull
に姓を変更しますほとんどの場合、マングースの更新方法で使用されます。 JavaScriptはディープオブジェクトのマージなどをサポートしていないためです。では、オブジェクトを適切にマージする可能性を得る最も良い方法は何ですか?
私は以下のことを行う方法を見つけたが、最善の解決策ではないようです。
User.findById(args.id, (error, user) => {
if (error) throw err;
user.name.first = args.name.first ? args.name.first : user.name.first;
user.name.last = args.name.last ? args.name.last : user.name.last;
user.email = args.email ? args.email : user.email;
user.save((err, updatedUser) => {
if (err) throw err;
return updatedUser;
});
});
IとEslintが再割り当てとunmaintainableコードでこれを好きではありません。誰かにもっと良いアイデアがありますか?私はlodashと他のライブラリをこの機能のためだけに使う必要があるかどうかはわかりません。
「埋め込みドキュメントのフィールド設定」(https://docs.mongodb.com/manual/reference/operator/update/set/#set-fields-in-embedded-documents)の ' $ set'演算子です。 –
それは私が探している解決策ではありません。この場合、この 'User.findByIdAndUpdate(args.id、{$ set:{'name.first':args.name.first、 'name.last':args.name.last、email:args .email}}) 'または' User.findByIdAndUpdate(args.id、{$ set:{name:args.name、email:args.email}}) 'を実行します。私はすべての引数を提供することを余儀なくされるか、argsが提供されていない場合、ユーザはnull値で上書きされるか、検証エラーを出します。あなたの時間をありがとう、ニール! –
いいえあなたは '{" $ set ":{" name.first ":" Eddy "、" email ":" '[email protected]' "}}'は必須フィールドだけを変更します。実際には、JavaScriptオブジェクトを「ドット表記」構文に変換する回答がどこかに投稿されていると思います。私はそれを見つけることができれば。 –