3

モンゴデータベースにドキュメントがあります

user:{
    name:'bruce',
    surname:'wayne',
    job:'batman',
    email:'onlyifdanger@batman.com',
}

したがって、ユーザーが情報を更新するときは、次のことを行う必要があります。

  1. ユーザーが存在する場合はデータベースにクエリを実行します
  2. 存在する場合は、データベースの値を取得します
  3. データベースの値をユーザーから送信されたフォームの値と比較します
  4. データベースの値が等しい場合は、操作を破棄します
  5. データベースの値が異なる場合は、フォームの値で値を更新してください
  6. dbを閉じてsend.response

したがって、この場合、ユーザーがこれを送信すると、次のようになります。

form.newUserInfo:{
    name:'bruce albert',
    surname:'wayne',
    job:'batman only at night',
    email:'onlyifdanger@batman.com',
}

名前と仕事を更新するだけです。

6ステップ未満でこれを行う方法はありますか?nodejs v0.10、mongodb 2.2.3、expressjs、mongoskinv0.5を使用しています

4

2 に答える 2

2

他のコメント/回答から必要な情報を入手している可能性があります。しかし、これはあなたが持っているデータをアップサートする非常に強力な方法です。

$ findAndModifyを使用すると、楽観的同時実行性とアップサートを制御できます。

必要に応じて違いを見つけることができますが、ドキュメントがユーザーが開いたときと同じであることが確実な場合は、findAndModifyを使用して、ドキュメントをアトミックに更新し、値がロードされたときのドキュメントと同じになるようにします。 。

このコマンドの更新部分はすべての値を更新しますが、必要に応じて、違いに基づいて簡単に制限できます。

クエリは、変更される前のドキュメントのすべての値と一致します。これにより、ユーザーが開いてから変更されていないことが保証されます。

db.people.findAndModify( {
   query: {
        name:'bruce',
        surname:'wayne',
        job:'batman',
        email:'onlyifdanger@batman.com',
    },    
   update: {
        name:'bruce',
        surname:'wayne',
        job:'business owner',
        email:'bruce@wayne.com',
    },
   upsert: true
   // uncomment next line to get the updated / new document return
   // ,new : true
} );
于 2013-03-18T16:58:09.950 に答える
1

オブジェクト全体ではなく、結果の特定のフィールドを更新しようとしているようです。つまり、ユーザーが名前の更新パラメーターのみを提供する場合、データベース内の名前のみを更新する必要があります。あなたの名前:'ブルース アルバート' の例を使用すると、newUserInfo は次のようになります。

newUserInfo: {
  name: 'bruce albert',
  surname: '',
  job: '',
  email: ''
}

すでに持っている情報を消去するか、情報の少ない重複レコードを追加するため、これらの値を単純に upsert したくはありません。

この場合、ここまでしか最適化できません。

  1. ユーザーが存在する場合、データベースへのクエリ
  2. 存在する場合は、データベースの値を取得します
  3. データベースの値とユーザーから送信されたフォームの値を比較します
  4. データベースからの値が等しい場合、操作を破棄します
  5. データベースの値が異なる場合は、フォームの値で値を更新します
  6. データベースを閉じて応答を送信

findOne() (またはその効果のあるもの) は、オブジェクトが存在する場合にのみ、パラメーターに一致するレコードを返すため、手順 1 と 2 を組み合わせることができます。存在しない場合は、ユーザーから渡された値を挿入することができます。

ステップ 4 は削除できます。本質的には何もしていないからです。

値がどのように「異なる」かを定義する必要があるため、ステップ 5 がおそらく最も重要です。job='' で更新しますか? それは「バットマン」とは「異なる」ためですが、その値で更新したくない場合があります。

私の手順は

  1. データベースにレコードが存在するかどうかを確認します。
    • そうでない場合は、オブジェクトを INSERT してステップ 3 に進みます。
    • その場合は、手順 2 に進みます
  2. データベース オブジェクトの値を、ユーザーが指定した値と比較します。
    • 値が (必要な方法で) 異なる場合は、必要に応じて各フィールドを更新します。
    • 値が同じ場合は、何もする必要はありません。手順 3 に進みます。
  3. データベースを閉じて、ユーザーに応答を送信します

お役に立てれば。

于 2013-03-18T12:43:15.453 に答える