我有一个节点应用程序将数据保存到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' }}
然后经过一些操作,我想更新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"参数来更新值而不是插入新值?
请帮。
您的代码总是将Replace参数设置为false,因此这些值将被添加到现有值。如果将其设置为true,则attribute的现有值总是被新值替换。例如
可选地,您可以为每个个体提供Replace参数属性。将此值设置为true会产生新的属性值替换现有的属性值(如果存在)。否则,Amazon SimpleDB只是插入属性值。例如,如果一个项目的属性{' a ', ' 1 '}, {' b ', ' 2 '},, {' b ', ' 3 '}请求者使用属性{'b'调用BatchPutAttributes,'4'}如果Replace参数设置为true,则项被更改为{'a', '1'}和{'b', '4'}。这发生因为新的'b'属性取代了旧的值。
—Source
statusUpdate:['2', true]
这里true不是替换参数。看看结果。代码将true作为该属性的值。
这里发生了一些其他的事情——这种行为是不被期望的。
我已经为这个添加了一个测试用例-签出这个提交:https://github.com/rjrodger/simpledb/commit/236aad0feefad9844548c4fde76e996ee3c4d347
并在文件夹test中运行:expresso simpledb.test.js -o putItemHappy(你可能需要NPM安装expresso)
同时,尝试在启用调试器的情况下运行:sdb = new simpledb.SimpleDB({…}),simpledb.debuglogger)
这将打印日志到控制台。
lib/simpledb.js:203中的putattrs函数设置put属性-如果您不提供数组-您的array,则设置替换模式。isArray没有被覆盖,对吧?
…啊
我想我明白是怎么回事了。
你试过了吗?
sdb.putItem('mySimpleDbTable','Record_0001',
{
statusUpdate:'2'
}
这个应该代替。
如果你使用数组(['2',true]),它不会替换-它假设你想设置多个值