如何使用putItem替换Node.js Simpledb中的属性值

时间:2013-03-02 01:45:22

标签: javascript node.js amazon-simpledb

我有一个节点应用程序将数据保存到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”参数来更新值而不是插入新值。

请帮忙。

2 个答案:

答案 0 :(得分:2)

您的代码始终将Replace参数设置为false,以便将这些值添加到现有值中。如果将其设置为true,则属性的现有值始终会被新值替换。即

  

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

- Source

statusUpdate:['2', true]

这里的确不是替换参数。查看结果。代码实际上是该属性的值。

答案 1 :(得分:1)

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

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

并在文件夹测试中运行: expresso simpledb.test.js -o putItemHappy (你可能需要npm install expresso)

此外,尝试启用debuglogger运行: sdb = new simpledb.SimpleDB({...}),simpledb.debuglogger)

这会将日志打印到控制台。

lib / simpledb.js中的putattrs函数:203执行put属性设置 - 如果你不提供数组,则设置替换模式 - 你的Array.isArray没有被覆盖,对吗?

......啊

我想我知道发生了什么。

你试过了吗?

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

这应该取代。

如果使用数组(['2',true]),则不会替换 - 它假定您要设置多个值。