我有一个节点应用程序将数据保存到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”参数来更新值而不是插入新值。
请帮忙。
答案 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]),则不会替换 - 它假定您要设置多个值。