GAE查找项目不在ListProperty中的实体

时间:2011-10-23 10:51:52

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

我有一个小应用程序,我在用户之间传递消息。我的消息模型就像这样

class Message(db.Model):
    from = db.UserProperty()
    sent_to_users = db.ListProperty(db.Key)

如果用户在线,我会将消息发送给用户,因此当我检测到用户在线时,我会发送任何尚未发送给他们的消息。我在/chat/presence/available handlermessage.sent_to_users.append(user)。表示邮件已发送至user

我的问题是如何过滤掉已发送给用户的邮件。根据{{​​3}}上的部分,!=转换为两个大于和小于的查询,然后将结果合并。不用说,在键列表的情况下不起作用。基本上members_not_sent_message = Message.all().filter('sent_to_users !=', available_user).fetch(100)不起作用。

有没有办法找到不在ListProperty中的值,或者我是否必须浏览每个项目并查找尚未发送的消息?或者是否有这样的系统的另一种设计可以绕过这个GAE数据存储限制(如果在这种情况下有一个)?

3 个答案:

答案 0 :(得分:2)

列表属性上的不等式过滤器确实不起作用。如您所知,不等式过滤器在底层运行单独的“小于值”和“大于值”查询,然后连接结果。具有多个值的列表属性将在同一索引中具有多个匹配,因此如果您过滤掉一个项目,则您将始终匹配另一个项目。

考虑保留两个列表:除sent列表外,保留not_sent列表,并查询该列表。

答案 1 :(得分:0)

答案 2 :(得分:0)

正如其他人所指出的那样,你不能做这个查询。您不应该使用ListProperty来跟踪任何可以无限增长的内容,例如未读消息,因为ListProperty可以获得多大的硬限制。相反,您应该在消息本身上有一个标记,指示它们是否已被发送/读取。

相关问题