0

GAE uygulamasında, tarihe göre sıralanması gereken bir sorgu yapıyorum. Sorgu filtresi İÇİNDE bir containt zorundadır, ancak bu aşağıdaki hata sonucu olduğunu: hata olarak (I tuşunun göre sıralama değiştirmek için önermek diğer SO soru (like this one), baştan sona kadar okuduktanGAE NDB İmleçler ile çok sayfalı sıralama

Şimdi
BadArgumentError: _MultiQuery with cursors requires __key__ order 

ayrıca dikkat çekiyor). Ancak sorun, sorgunun amacı için işe yaramaz hale gelmesidir. Tarihe göre sıralanması gerekiyor. Bunu başarmanın yolları neler olurdu?

cevap

0

Cloud Datastore sunucusu, IN desteklemiyor. NDB istemci kitaplığı, IN ile bir sorguyu eşitlik işleçleri ile birden çok tek sorguda bölme yoluyla bu işlevselliği etkin bir şekilde sayar. Daha sonra sonuçları istemci tarafında birleştirir.

Aynı varlık, bu tek sorgunun 1 veya daha fazlasında döndürülebildiğinden, bu değerlerin bir araya getirilmesi, Key ** tarafından sipariş edilmedikçe, hesaplamasal olarak aptal hale gelir *.

İlgili, sen daha iyi anlamak için underlying caveats/limitations on cursors içine okumalısınız: IN kullanılan değerlerin listesi statik listedir yerine zamanında belirlenir Eğer

  • Because the NOT_EQUAL and IN operators are implemented with multiple queries, queries that use them do not support cursors, nor do composite queries constructed with the CompositeFilterOperator.or method.
  • Cursors don't always work as expected with a query that uses an inequality filter or a sort order on a property with multiple values. The de-duplication logic for such multiple-valued properties does not persist between retrievals, possibly causing the same result to be returned more than once.

, çalışma etrafında bu hesaplamak etmektir Varlığı yazdığınızda dizinlenmiş bir Boole alanı. Bu, tek bir eşitlik filtresi kullanmanıza olanak tanır. Örneğin, bir hata izleyiciniz varsa ve açık sorunların listesini görmek istiyorsanız, sorgunuzda bir IN('new', 'open', 'assigned') kısıtlaması kullanabilirsiniz. Alternatif olarak, is_open adlı bir özelliği True yerine ayarlayabilirsiniz, böylece IN koşuluna artık gerek yoktur.


* Hesaplamayla saçma: Geçerli alınan Varlık yineleniyor olup olmadığını belirlemek için önce alınmış olan değerler sınırsız bir sayısı üzerinden doğrusal tarama yapıyor gerektirir. Ayrıca kavramsal olarak Cursors ile uyumlu değildir.

** Anahtar, bir sonraki değer kümesini almak için farklı tekli sorgular arasında geçiş yapabildiğimiz ve tüm sonuç kümesi kümesinde bir doğrusal tarama yapmaktan endişe etmememiz gerektiğinden çalışır. Bu bize çalışacak sınırlı bir veri seti sağlar.

+0

Teşekkürler, bayrak fikriyle etrafta oynayacağım ve istediğimi yapıp yapamayacağımı göreceğim. – Vincent

İlgili konular