0

我有一个节点应用程序将数据保存到 Amazon SimpleDb 以使用 rjrodger/simpledb 节点驱动程序 ( https://github.com/rjrodger/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' }}

然后经过几次操作,我想像这样将 statusUpdate 更新为'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,则属性的现有值总是被新值替换。IE

或者,您可以为每个单独的属性提供替换参数。将此值设置为 true 会导致新属性值替换现有属性值(如果存在)。否则,Amazon SimpleDB 只会插入属性值。例如,如果一个项目具有属性 { 'a', '1' }, { 'b', '2'} 和 { 'b', '3' } 并且请求者使用属性 { 'b ', '4' } 将 Replace 参数设置为 true,项目的最终属性更改为 { 'a', '1' } 和 { 'b', '4' }。这是因为新的“b”属性替换了旧值。

--来源

statusUpdate:['2', true]

这里的 true 不是 replace 参数。查看结果。代码将 true 作为该属性的值。

于 2013-03-05T05:36:23.533 回答
1

这里还有其他事情发生 - 这种行为不是预期的。

我为此添加了一个测试用例 - 签出此提交: https ://github.com/rjrodger/simpledb/commit/236aad0feefad9844548c4fde76e996ee3c4d347

并在文件夹 test 中运行: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 回答