GAE находит объекты с элементом, которого нет в ListProperty

#python #google-app-engine #google-cloud-datastore

#python #google-app-engine #google-облако-хранилище данных

Вопрос:

У меня есть небольшое приложение, в котором я передаю сообщения между пользователями. Моя модель для сообщения выглядит следующим образом

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

Я отправляю сообщение пользователям, если они подключены к Сети, поэтому, когда я обнаруживаю, что пользователь подключен к Сети, я отправляю любое сообщение, которое еще не было им отправлено. Я делаю message.sent_to_users.append(user) это в обработчике /chat / presence/available . Чтобы указать, что сообщение уже отправлено в user

Мой вопрос в том, как мне отфильтровать сообщения, которые уже были отправлены пользователю. Согласно разделу о фильтре неравенства в запросах a != преобразуется в два запроса для большего и меньшего, а затем результаты объединяются. Что, разумеется, не работает в случае списка ключей. В принципе members_not_sent_message = Message.all().filter('sent_to_users !=', available_user).fetch(100) , не работает.

Есть ли способ найти значения, которых нет в ListProperty, или мне нужно просмотреть каждый элемент и найти сообщения, которые не были отправлены? Или есть другой дизайн для подобной системы, который обходит это ограничение хранилища данных GAE (если оно есть в этом случае)?

Комментарии:

1. Нет, хорошего способа сделать это нет. Каждый элемент в ListProperty индексируется отдельно.

2. Если бы я это реализовывал, я бы сохранял недоставленные сообщения пользователем. Это может привести к увеличению объема памяти, но я думаю, что это сделает код намного чище.

Ответ №1:

Фильтры неравенства в свойствах списка на самом деле не работают. Как вы знаете, фильтры неравенства выполняют отдельные запросы «меньше значения» и «больше значения» под капотом, а затем объединяют результаты. Свойства списка с несколькими значениями будут иметь несколько совпадений в одном индексе, поэтому, если вы отфильтруете один элемент, вы всегда будете соответствовать другому.

Рассмотрите возможность сохранения двух списков: помимо sent списка, сохраните not_sent список и запросите его.

Комментарии:

1. Принимая этот ответ, поскольку он ближе всего к тому, что я закончил делать. Я добавил список сообщений, которые должны быть отправлены для каждого пользователя, и я удаляю сообщение из списка (или очереди) после отправки сообщения.

Ответ №2:

Комментарии:

1. Это для неравенств, использующих несколько свойств. Я хочу проверить наличие определенного значения, которого нет в ListProperty. != похоже, не работает с одним ListProperty.

Ответ №3:

Как указывали другие, вы не можете выполнить этот запрос. Однако вы не должны использовать свойство ListProperty для отслеживания всего, что может расти неограниченно, например, непрочитанных сообщений, поскольку существуют жесткие ограничения на то, насколько большим может быть свойство ListProperty. Вместо этого у вас должен быть флаг в самих сообщениях, который указывает, были ли они отправлены / прочитаны.

Комментарии:

1. ограничение на 5000 для размера ListProperty, если быть точным. Кажется, что 5000 — это магическое число для Google, когда речь идет об ограничении чего-либо… должно быть их ограничение BigTable…