如何获取唯一键列表的列的最大值列表

时间:2015-05-04 14:27:43

标签: ios parse-platform nosql

让我们说我在Parse上有一个表,它有两列:手工设置的标识符和数字属性。

我需要编写一个查询,根据每个唯一标识符获取数字属性的最大数量。所以在下面的例子中:

| identifier | value |
----------------------
| 1          | 10    |
| 2          | 5     |
| 1          | 7     |
| 2          | 9     |

我希望得到以下结果:

| identifier | value |
----------------------
| 1          | 10    |
| 2          | 9     |

现在我知道Parse没有像Group By语句那样的东西,所以这可能不适用于单个查询。

在这种情况下,您会建议哪种替代方案?我看到了一些解决方案,每个都有严重的缺点:

  • 根据多个查询撰写结果。这将需要一个获取唯一标识符列表的查询,然后为每个标识符单独查询以获取最大值。如果表的大小增加,这可能无法很好地扩展。此外,结果并不完全一致,因为DB可以在查询之间进行更改(对于我的用例,稍微陈旧的日期也不算太差)。这将严重影响请求配额限制,因为单个请求现在可以触发大量请求。
  • 保留一个跟踪此结果的单独表格。对于每个标识符,此表将包含一行,其中包含最大值。为此,我需要一个更新第二个表的beforeSave触发器。从我所读到的内容来看,并不能保证beforeSave触发器不会同时执行,因此确保我不会意外地为同一个标识符插入多个值是非常棘手的。我可能不得不运行一个删除重复项的后台作业。

对于我的用例,我需要在iOS设备上获取数据,因此网络流量也是一个问题。

2 个答案:

答案 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>

https://www.parse.com/plans/faq