更新azure移动服务数据库中的现有项目

时间:2015-03-25 13:06:37

标签: javascript android azure azure-mobile-services serverside-javascript

我有一个服务器端脚本,它尝试使用脚本中计算的新数据更新已存在的行。当那里没有一行时,它会很好地添加到表中。但是当我尝试更新行时,我在应用程序中收到错误,告诉我具有该id的项已经存在。 下面是我用于脚本的代码。任何提示都将非常感激。

function insert(item, user, request) {
var table = tables.getTable('Reviews');
table.where({ 
   text: item.id
}).read({
   success: upsertItem
});

function upsertItem(existingItems) {
    if (existingItems.length == 0) {
        item.numReviews = 1;
        item.rating = item.reviews;
        request.execute();
    } else {
        item.id = existingItems[0].id;
    item.numReviews = existingItems[0].numReviews + 1;
    var average = existingItems[0].reviews / item.numReviews;
    item.reviews = existingItems[0].reviews + item.reviews;
    item.rating = average;
      table.update(item, {
        success: function(updatedItem) {
            request.respond(200, updatedItem)
        }
      });
    }
 }

}

1 个答案:

答案 0 :(得分:1)

对于初始查询,您希望通过id字段进行查询:

table.where({
    id: item.id
}).read({
    success: upsertItem
});

编辑:进一步澄清 您的查询对象{text: item.id}实际上已转换为SQL查询select * from Reviews where text = item.id,其中item是POST正文。因此,您的代码示例正在搜索文本列中包含id值的Reviews。它没有找到任何,所以upsert()回调函数if if语句因为existingItems为空而求值为true,并尝试通过调用request.execute()来插入该项。

根据我建议的更改,使用{id: item.id}会变成一个类似的查询 select * from Reviews where id = item.id所以它会在id列中搜索带有匹配id值的Review。