0

rjrodger/simpledb ノード ドライバー ( https://github.com/rjrodger/simpledb )を使用して名前と値のペアのデータを保存するために、Amazon SimpleDb にデータを保存するノード アプリケーションがあります。以下のようにputItemを呼び出します。

sdb.putItem('mySimpleDbTable','Record_0001', 
{
   statusUpdate:'1'
},
function(err,res,meta){
  if (err) {
     console.log('Status Update error: ' + err.Message);
   }
  console.log("Memories, you're talking about memories: "+JSON.stringify(res)) 
})

以下のようなレコードを挿入します。

{ $ItemName: 'Record_0001' { statusUpdate: '1' }}

次に、いくつかの操作の後、次のように statusUpdateto '2' を更新したいと思います。

{ $ItemName: 'Record_0001' { statusUpdate: '2' }}

どのように試しても、Node simpleDb ドライバーは常に次のような新しい属性を挿入します。

{ $ItemName: 'Record_0001' { statusUpdate: '1',  statusUpdate: '2' }}

私が試したら

sdb.putItem('mySimpleDbTable','Record_0001', 
{
statusUpdate:['2', true]
}

それから私は-

{ $ItemName: 'Record_0001' { statusUpdate: '1',  statusUpdate: '2', statusUpdate: 'true' }}

putItem の「replace:true」パラメータを使用して、新しい値を挿入する代わりに値を更新するにはどうすればよいですか。

助けてください。

4

2 に答える 2

2

コードは常にReplaceパラメーターをfalseに設定しているため、これらの値は既存の値に追加されます。trueに設定すると、属性の既存の値は常に新しい値に置き換えられます。すなわち

オプションで、個々の属性ごとに置換パラメーターを指定できます。この値をtrueに設定すると、新しい属性値が既存の属性値(存在する場合)に置き換わります。それ以外の場合、AmazonSimpleDBは単に属性値を挿入します。たとえば、アイテムに属性{'a'、 '1'}、{'b'、 '2'}、および{'b'、 '3'}があり、リクエスターが属性{'bを使用してBatchPutAttributesを呼び出す場合'、' 4'}をReplaceパラメーターをtrueに設定すると、アイテムの最終属性が{'a'、' 1'}および{'b'、'4'}に変更されます。これは、新しい「b」属性が古い値を置き換えるために発生します。

-出典

statusUpdate:['2', true]

ここでtrueは、その置換パラメーターではありません。結果をご覧ください。コードは、その属性の値としてtrueを取ります。

于 2013-03-05T05:36:23.533 に答える
1

ここで何か他のことが起こっています-その振る舞いは予期されていません。

このためのテストケースを追加しました-このコミットをチェックアウトしてください: https ://github.com/rjrodger/simpledb/commit/236aad0feefad9844548c4fde76e996ee3c4d347

フォルダーテストで実行します:expresso simpledb.test.js -o putItemHappy(npm install expressoが必要な場合があります)

また、デバッグロガーを有効にして実行してみてください:sdb = new simpledb.SimpleDB({...})、simpledb.debuglogger)

これにより、ログがコンソールに出力されます。

lib / simpledb.js:203のputattrs関数は、put属性を設定します-配列を指定しない場合は置換モードが設定されます-Array.isArrayは上書きされていませんよね?

...ああ

何が起こっているのかわかります。

やってみました:

sdb.putItem('mySimpleDbTable','Record_0001', 
{
  statusUpdate:'2'
}

これを置き換える必要があります。

配列(['2'、true])を使用する場合、それは置き換えられません。複数の値を設定することを前提としています。

于 2013-03-04T18:20:06.647 に答える