解析服务器使用云代码自动填充和更新列

Parse Server populating and updating a column automatically with cloud code

我有一个名为 Stats 的 class,其中包含列 secondsPlayed(数字)、createdAt(日期)和 timeScore(数字)

此 class 包含数千个对象,但 timeScore 列为空。

我想使用 secondsPlayed(数字)、createdAt(日期)列的公式填充 timeScore 列,就像您在 Excel 中所做的那样。公式为:

(secondsPlayed*10^8)/(Date.now()-createdAt.getTime())

如您所见,timeScore 列的值应该每秒更改一次,因为 Date.now()secondsPlayed 是不断变化的变量。

因此,我想每 5 分钟更新并重新填充一次 timeScore 列。这应该会自动发生。

最好的方法是什么?我认为使用云代码计算和填充 timeScore 列,然后使用简单的 Parse 查询获取 timeScore 列表,这与将数千个对象下载到每个设备并每 5 次计算和更新相比是最好的分钟客户端。

我不太了解编写云代码,但通过阅读 this guide and 我想出了以下代码。

const _ = require("underscore");
Parse.Cloud.define("timeScore", function(request, response) {
  const query = new Parse.Query("Stats");
  const maxSeconds = (Date.now() - new Date('2017-12-12T06:00:04.022Z').getTime())/1000;
  query.lessThan("secondsPlayed", maxSeconds);
  query.find().then(function(results) => {
        _.each(results, function(result) {
            var secondsPlayed = result.get("secondsPlayed") || 0;
            var createdAt = result.get("createdAt") || new Date('2017-12-12T06:00:04.022Z');
            result.set("timeScore", (secondsPlayed*100000000)/(Date.now()-createdAt.getTime()));
      });
        return Parse.Object.saveAll(results);
    }).then(function(results) {
        response.success(results);
    }, function(error) {
        response.error(error);
    })
    .catch(() =>  {
      response.error("FAILED");
    });
});

我不知道如何处理这段代码。我不知道如何测试它,或者它是否有效。我该如何进行?

我需要从 xamarin 应用程序调用它吗?我只需要根据代码每 5 分钟填充和更新一次列。我不需要从应用程序调用云代码。我只想从应用程序中查询 timeScore 列。这可能吗?

要从 .net 客户端进行测试,ParseCloud 提供 CallFunctionAsyncSee the guide for an example here

您会发现代码中至少有一个问题是查询最多 return 1k 个对象,因此 query/update/save 逻辑将不得不游标每个 Stats 个对象时间这个 运行s.

测试完成后,您需要创建一个网络工作者,Heroku 会让您安排它。 See their guide about that here.

但我不愿意就这些要点进一步详细说明,因为我不同意这个问题的前提:应该完成或定期完成此更新。

请考虑 运行使用此代码不会向系统添加任何新信息。 createdAt 字段保持不变。这段代码所做的只是产生一种奇怪的方式来表示当前时间(作为创建时间和此后的间隔)每 运行 数千次。这正是只有在需要为给定对象知道该间隔(现在 - createdAt)时才应该做的事情。