Python 多个查询与手动排序一个大查询(AppEngine NDB)

Python 多个查询与手动排序一个大查询(AppEngine NDB),python,google-app-engine,app-engine-ndb,Python,Google App Engine,App Engine Ndb,对于以下车型: class Thing(ndb.Model): visible = ndb.BooleanProperty() made_by = ndb.KeyProperty(kind=User) belongs_to = ndb.KeyProperty(kind=AnotherThing) 基本上执行“或”查询,但比较不同的属性,因此我不能使用内置或。。。我想获得所有对象(属于某个特定的另一个对象),它们的可见设置为真,或者可见为假,并且由当前用户生成 对数据存储

对于以下车型:

class Thing(ndb.Model):
    visible = ndb.BooleanProperty()
    made_by = ndb.KeyProperty(kind=User)
    belongs_to = ndb.KeyProperty(kind=AnotherThing)
基本上执行“或”查询,但比较不同的属性,因此我不能使用内置或。。。我想获得所有
对象
(属于某个特定的
另一个对象
),它们的
可见
设置为
,或者
可见
,并且
由当前用户生成

对数据存储的要求较低(即财务成本较低):

  • 查询以获取所有内容,即:
    Thing.Query(Thing.bellowns\u to==some\u Thing.key)
    并遍历结果,存储可见结果和不可见但由当前用户生成的结果

  • 查询以获取可见的,即:
    Thing.Query(Thing.belown\u to==some\u Thing.key,Thing.visible==“True”)
    和单独查询以获取当前用户的不可见的,即:
    Thing.Query(Thing.belown\u to==some\u Thing.key,Thing.visible==“False”,Thing.make\u by=当前用户)

  • 第一。会得到很多不需要的结果,比如其他用户看不见的
    东西
    s,我想这是对数据存储的多次读取?2.不过,这两个完整的查询也可能是不必要的沉重,对吗?我仍在努力找出与数据库的何种交互会导致何种成本


    我在必要时使用ndb、tasklets和memcache,以备不时之需。

    您可能是使用真实数据对这两种情况进行基准测试的最佳选择。很难抽象地确定这样的事情,因为有许多微妙之处可能会影响整体性能


    不过,我希望选择2会更好。加载大量您不关心的对象只会给数据存储带来沉重的负担,我认为额外的查询无法与之相比。当然,这取决于有多少额外的东西等等。

    出于两个原因,第二个在财务上会更少。首先,您为每次读取数据存储和查询中返回的每个实体支付费用,因此,您将为第一个必须读取所有数据和查询所有数据的实体支付更多费用。第二种方法是你只为你需要的东西付钱

    其次,您还需要支付后端或前端时间,并且您将使用时间在第一种方法中迭代所有结果,因为您不需要为第二种方法花费时间

    我看不出第一种选择更好。(如果您只有几个实体,可能会这样做??)

    要了解读取和查询的成本,请向下滚动一点:

    您将看到如何将读取、写入和Smalls相加以进行读取、写入和查询


    我还将只查询当前用户拥有的索引,而不是visible=false和owner=current,这样您就不需要一个可以节省时间的复合索引。您还可以使部分索引可见,这也节省了一些空间(仅在为true时对其进行索引,假设您不需要查询false)。您需要做一些工作来删除重复项,但这可能还不错。

    为什么您说您不能使用或?