1

Ich habe festgestellt, dass die ndb Datenspeicher-API verwenden, ich so etwas wieGoogle-Datenspeicher ndb.AND vs. und

Entity.query(Entity.p1 == 1 and Entity.p2 == 2) 

oder

mit
Entity.query(ndb.AND(Entity.p1 == 1, Entity.p2 == 2)) 

eine Abfrage für etwas mit Beteiligung mehrerer Eigenschaften durchführen kann Diese ergeben das gleiche Ergebnis, jedoch benötigt der zweite einen zusätzlichen Index für die Eigenschaften p1 und p2, um die Abfrage durchzuführen. Wenn Sie .filter für die Abfrage anstelle von ndb.AND verwenden, ist auch kein Index erforderlich. Was ist der Unterschied zwischen diesen Methoden des Abfrage-Datenspeichers?

Antwort

4

Seien Sie vorsichtig; Die erste Version ('und') berechnet nur den zweiten Teil des Filters. Versuchen Sie folgendes:

clause = (Entity.p1 == 1 and Entity.p2 == 2) 
print clause 

=>

FilterNode('p2', '=', 2) 

Doing die folgenden Ergebnisse in den erwarteten Filter:

clause = (Entity.p1 == 1, Entity.p2 == 2) 

=>

(FilterNode('p1', '=', 1), FilterNode('p2', '=', 2)) 

, die zu dem, was ähnlich ist Ihr zweite Klausel mit ndb.AND-Ergebnissen in ie:

AND(FilterNode('p1', '=', 1), FilterNode('p2', '=', 2)) 

(In diesem Fall sind die Abfrageergebnisse identisch).

Da für eine einzelne Eigenschaftsabfrage kein zusätzlicher Index erforderlich ist, werden für die erste Abfrageversion keine Indizes generiert (mit 'und').