让我们说我在Parse上有一个表,它有两列:手工设置的标识符和数字属性。
我需要编写一个查询,根据每个唯一标识符获取数字属性的最大数量。所以在下面的例子中:
| identifier | value |
----------------------
| 1 | 10 |
| 2 | 5 |
| 1 | 7 |
| 2 | 9 |
我希望得到以下结果:
| identifier | value |
----------------------
| 1 | 10 |
| 2 | 9 |
现在我知道Parse没有像Group By语句那样的东西,所以这可能不适用于单个查询。
在这种情况下,您会建议哪种替代方案?我看到了一些解决方案,每个都有严重的缺点:
对于我的用例,我需要在iOS设备上获取数据,因此网络流量也是一个问题。
答案 0 :(得分:0)
鉴于这些限制,我认为您最好的选择是使用CloudCode afterSave
事件。 beforeSave
可能会对您的用户造成太大的额外减速影响。经验。
通过在更改max-value表并删除该标识符的任何值之前查询max-value表,可以解决并发触发器问题。像这样:
Parse.Cloud.afterSave("Yourclass", function(request) {
var objectToSave = request.object;
query = new Parse.Query("Maxvaluetableclass");
query.equalTo("identifier", objectToSave.identifier);
query.lessThan("value", objectToSave.value);
query.find({
success: function(results) {
//Delete all the objects in the max value table with smaller values
for (var i = 0; i < results.length; i++) {
var object = results[i];
object.destroy();
}
var Maxvaluetableclass = Parse.Object.extend("Maxvaluetableclass");
var maxValueObject = new Maxvaluetableclass();
maxValueObject.identifier = objectToSave.identifier;
maxValueObject.value = objectToSave.value;
maxValueObject.save();
},
error: function(error) {
//All current values are larger, so do nothing
}
});
});
更新:您会注意到这种改进后的设置是“自我清洁”#39; - 每次运行时,它会删除所有较小的项目。这意味着您不必运行后台功能
答案 1 :(得分:0)
@Ryan Kreager:我没有50手,所以我无法评论以前的答案。 参考你的答案,OP应该考虑触发这种后续频率的频率。因为如果你有很多记录,那么for循环中的每个destroy()都算作1个API请求。如果我在Parse中正确理解了定价。 / p>