2017-05-24 11 views
2

この場合、マングースを使用したいと思います。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と他のライブラリをこの機能のためだけに使う必要があるかどうかはわかりません。

+0

「埋め込みドキュメントのフィールド設定」(https://docs.mongodb.com/manual/reference/operator/update/set/#set-fields-in-embedded-documents)の ' $ set'演算子です。 –

+0

それは私が探している解決策ではありません。この場合、この '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値で上書きされるか、検証エラーを出します。あなたの時間をありがとう、ニール! –

+0

いいえあなたは '{" $ set ":{" name.first ":" Eddy "、" email ":" '[email protected]' "}}'は必須フィールドだけを変更します。実際には、JavaScriptオブジェクトを「ドット表記」構文に変換する回答がどこかに投稿されていると思います。私はそれを見つけることができれば。 –

答えて

0

ここで私はこの問題を解決しました。

Neil Lunnのおかげで、this ideaです。

すべてのオブジェクトキーをdot.notationにマップし、$ setに渡す必要があります。

ここには、この機能を持つgistがあります。 2つのレベルのネストが必要な場合は、別の条件とマッピングを追加できます。

とにかく私はMongoose APIがネストされたオブジェクトと深くマージするように解決してくれることを願っていますが、現在はNeilの解決策が私の意見では最高です。

関連する問題