我知道有类似的问题,但我认为没有解决方法。 如果数据库中不存在,我想创建新对象,如果存在则更新。 这是我的简单代码:
Parse.Cloud.beforeSave("Tag", function(request, response) {
var query = new Parse.Query("Tag");
query.equalTo("name", request.object.get("name"));
query.first({
success: function(result) {
if (!result) {
response.success();
} else {
result.increment("popularityCount");
result.save();
}
},
error: function(error) {
alert("Error: " + error.code + " " + error.message);
}
});
});
如你所见,我在保存前调用它。如果查询没有找到任何内容,则创建新条目。如果查询找到了某些内容,则应该采用此结果,并popularityCount
。但事实并非如此。它仅在我之后调用response.success()
时才有效,但调用此函数也会导致创建新条目。
答案 0 :(得分:1)
在每次保存时增加对象上的计数器似乎是错误的。如果由于其他原因修改了对象怎么办?如果你确实想在每次保存时增加一个字段,则不需要查询 - 保存的对象将传递给该函数。此外,在保存新对象的情况下,查询将无效。
相反,如何找到或创建对象作为一个操作,当app逻辑调用它时递增计数器
function findOrCreateTagNamed(name) {
var query = new Parse.Query(Tag);
query.equalTo("name", name);
return query.first().then(function(tag) {
// if not found, create one...
if (!tag) {
tag = new Tag();
tag.set("popularityCount", 0);
tag.set("name", name);
}
return (tag.isNew())? tag.save() : Parse.Promise.as(tag);
});
}
function incrementPopularityOfTagNamed(name) {
return findOrCreateTagNamed(name).then(function(tag) {
tag.increment("popularityCount");
return tag.save();
});
}
现在不需要beforeSave逻辑(这似乎是正确的做法,而不是解决方法)。
Parse.Cloud.beforeSave("Tag", function(request, response) {
var tag = request.object;
tag.increment("popularityCount");
response.success();
});