2016-09-03 4 views
0

ドキュメントがある場合は更新するか、ドキュメントがない場合は追加する場合は、upsertがあります。upsertがドキュメントのようにフィールドを更新または設定する方法はありますか?

フィールドが存在する場合は更新するか、そうでない場合は追加しますか?

私の文書は、最初からこのようになりますUserProfilesと呼ばれる想像:

{ 
    _id: "c8fdu98JC", 
    questions: [] 
} 

しかし、答えが追加された場合も、次のようになります。

{ 
    _id: "c8fdu98JC", 
    questions: [{questionId: "age", answerId: "b"}] 
} 

したがって、ユーザーが答えをクリックしますか、彼の心を変えて別の答えを選んでください。このフィールドを更新または設定するには、upsert種類の操作を実行できますか?

これ、それがすでに存在する場合

UserProfiles.update({_id: userId, 
    'questions.questionId': questionId}, 
    {$set: {'questions.$.answerId': answerId}}) 

のみを更新します。

答えがこの目的のためにupsert種類の操作が利用できない可能性が非常に高いので、これを最もコストのかからない(ただし安全な)方法で行うにはどうすればよいでしょうか?

答えて

0

$addToSetを使用すると、ドキュメントが存在しない場合は追加できます。

しかし、配列の更新には全く相違はないので、アプリケーションコードに既に存在する場合は更新する必要があります。

または、更新のための2つのステップ操作$pull、次に$pushを使用できます。存在すればそれを削除し、新しいデータをプッシュで追加します。それ以外の場合は、単にプッシュします。私は現在、これをやっている

-1

UserProfiles.update({_id: userId, 
    'questions.questionId': questionId}, 
    {$set: {'questions.$.answerId': answerId}}, 
    function(error, result) { 
     if (error || result === 0) { 
      UserProfiles.update({_id: userId}, 
       {$addToSet: {questions: {questionId: questionId, answerId: answerId}}}) 
     } 
    } 
) 

それはかなりまともだ、私は考えます。誰かがより良い方法を持っているなら、教えてください!

関連する問題