2011-10-23 2 views
0

사용자간에 메시지를 전달하는 애플리케이션이 있습니다. 메시지에 대한 나의 모델은 온라인 있다면 사용자에게 메시지를 보내이GAE는 ListProperty에없는 항목이있는 엔티티를 찾습니다.

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

내 질문은 사용자에게 이미 보낸 메시지를 어떻게 필터링합니까? inequality filter in queries에 대한 섹션에 따르면 !=은 두 개 이상의 쿼리를 두 개 이상의 쿼리로 변환 한 다음 결과를 결합합니다. 키 목록의 경우에는 말할 것도없이 작동하지 않습니다. 기본적으로 members_not_sent_message = Message.all().filter('sent_to_users !=', available_user).fetch(100)이 작동하지 않습니다.

ListProperty에없는 값을 찾는 방법이 있습니까? 아니면 각 항목을 살펴보고 전송되지 않은 메시지를 찾아야합니까? 아니면이 GAE 데이터 저장소 제한을 우회하는 이와 같은 시스템을위한 또 다른 설계가 있습니까 (이 경우 하나가있는 경우)?

+0

아니요, 이렇게하는 좋은 방법은 없습니다. ListProperty의 각 항목은 별도로 인덱싱됩니다. – geoffspear

+0

이것을 구현하는 경우 사용자가 배달하지 않은 메시지를 저장합니다. 저장 용량은 늘어날 수 있지만 코드를 훨씬 더 깨끗하게 만들 것입니다. –

답변

2

목록 속성의 부등호 필터가 실제로 작동하지 않습니다. 아시다시피, 불평등 필터는 후드 아래에서 별도의 "값보다 작음"및 "값보다 큰"쿼리를 실행 한 다음 결과를 연결합니다. 여러 값을 가진 목록 속성은 동일한 색인에 여러 개의 조회가 있으므로 한 항목을 필터링하면 다른 항목과 일치하게됩니다.

두 목록을 유지하는 것을 고려하십시오. sent 목록 외에 not_sent 목록을 유지하고 쿼리하십시오.

+0

내가이 일을 끝내고 나서이 대답을 받아 들였다. 각 사용자에게 보낼 메시지 목록을 추가했으며 메시지를 보내면 목록 (또는 대기열)에서 메시지를 제거합니다. – arunkumar

0

다른 사람들이 지적했듯이이 쿼리를 수행 할 수 없습니다. ListProperty를 사용하여 읽지 않은 메시지와 같이 무제한으로 성장할 수있는 항목을 추적해서는 안됩니다. ListProperty의 크기에 하드 제한이 있기 때문입니다. 대신 메시지 자체에 보내기/읽기 여부를 나타내는 플래그가 있어야합니다.

+0

ListProperty 크기가 5000으로 제한됩니다. 5000이 뭔가를 제한 할 때 Google의 마법의 숫자 인 것처럼 보입니다 ... BigTable 제약이 있어야합니다 ... – topchef

관련 문제