我有一个小应用程序,我在用户之间传递消息。我的消息模型就像这样
class Message(db.Model):
from = db.UserProperty()
sent_to_users = db.ListProperty(db.Key)
如果用户在线,我会将消息发送给用户,因此当我检测到用户在线时,我会发送任何尚未发送给他们的消息。我在/chat/presence/available handler中message.sent_to_users.append(user)
。表示邮件已发送至user
我的问题是如何过滤掉已发送给用户的邮件。根据{{3}}上的部分,!=
转换为两个大于和小于的查询,然后将结果合并。不用说,在键列表的情况下不起作用。基本上members_not_sent_message = Message.all().filter('sent_to_users !=', available_user).fetch(100)
不起作用。
有没有办法找到不在ListProperty中的值,或者我是否必须浏览每个项目并查找尚未发送的消息?或者是否有这样的系统的另一种设计可以绕过这个GAE数据存储限制(如果在这种情况下有一个)?
答案 0 :(得分:2)
列表属性上的不等式过滤器确实不起作用。如您所知,不等式过滤器在底层运行单独的“小于值”和“大于值”查询,然后连接结果。具有多个值的列表属性将在同一索引中具有多个匹配,因此如果您过滤掉一个项目,则您将始终匹配另一个项目。
考虑保留两个列表:除sent
列表外,保留not_sent
列表,并查询该列表。
答案 1 :(得分:0)
答案 2 :(得分:0)
正如其他人所指出的那样,你不能做这个查询。您不应该使用ListProperty来跟踪任何可以无限增长的内容,例如未读消息,因为ListProperty可以获得多大的硬限制。相反,您应该在消息本身上有一个标记,指示它们是否已被发送/读取。