【问题标题】:Cloud Endpoints calculated an Entity property at query timeCloud Endpoints 在查询时计算实体属性
【发布时间】:2016-01-24 18:04:04
【问题描述】:

如何在查询时计算实体中的属性?

例如,如果我有一个 Post 实体并且我做了 getPost(Long postId),我希望通过计算有多少 Like 实体与特定Post 键。

如果这不可能,我正在考虑为每个Post 实体存储一个Int likes 属性,每次插入新的Like 时我只需将其递增1。

【问题讨论】:

    标签: google-app-engine google-cloud-endpoints google-cloud-datastore


    【解决方案1】:

    两者都可以。对于后者,如果您期望有很多 lps(每秒喜欢的次数),我将使用分片计数器。我会使用第一种方法,但从那时起,一个like 可以有 meta like,它是什么时候创建的,由谁创建的等等。

    在查询时没有真正的计算。您必须自己编写查询来总结喜欢。在 Objectify 中,您可以在查询后使用 @OnLoad 注释为每个帖子查询它。我强烈建议您不要这样做,因为这将是对查询的每个返回 Post 的查询。您确实应该手动执行此操作,以避免在您甚至不需要它们时对喜欢进行冗余查询。

    【讨论】:

    • 我所做的是查询Post的列表,然后遍历每个Post并查询有多少Like实体,然后设置Post'就像数量一样。查询很多,但 GAE 可以处理吗?
    • 我会尝试减少查询次数。不过,我现在不知道该怎么做。我得睡一觉了。分片计数器不会提高查询量,只是限制结果计数。也许我明天有个好主意。
    • 所以我想了更多。您最初的第二种方法很糟糕,因为您会遇到每秒 1 次写入的限制,但是这种方法可以与分片计数器一起使用,其行为类似于您当前的方法。唯一的区别是您可以在 Google 文档中找到的分片计数器的实现使用缓存,因此在平均情况下,您总是在缓存中拥有喜欢的数量,而您不必查询。所以这将是性能的最佳选择。但是,如果您的 Likes 有元数据或对喜欢 Post 的人的引用,这将不起作用。
    • 总结一下:您应该构建您的实体以实现您的用例的最佳性能。由于我不知道确切的用例,因此很难说出最好的方法是什么。由于无论用例如何,您当前的方法都应该有效(即使它可能会给您带来轻微的性能下降),我建议您继续这样做,并且可能在旁边/稍后做一些实验。
    • 我采用的方法是我对这个答案的第一条评论——我现在能想到的最好的方法。我觉得它可能会处理很多“喜欢”的帖子。我同意问题中的第二种方法很糟糕,因为每秒写入 1 次的限制。感谢您的帮助!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-07
    • 1970-01-01
    • 1970-01-01
    • 2012-07-09
    相关资源
    最近更新 更多