IN 对面的对象化查询
Objectify Query Opposite of IN
假设我有一个名为 EntityA 的实体种类,并且我有一个 EntityA id 列表。我如何从我的数据库中查询所有 EntityA 实体,而这些实体的 ID 不在我拥有的 EntityA ID 列表中?
我正在尝试做类似的事情:
ofy().load().type(EntityA.class).filter("!IN", entityAKeys);
我怎样才能让它工作?可能吗?
不,这不受支持,因为 Cloud Datastore 仅允许索引支持的查询以确保它们不会随着数据集扩展而中断。
您将不得不查询 kind EntityA 中的所有实体,并自行在客户端过滤掉 entityAKeys 中的实体。
所以我最后做了这样的事:
List<Key<MXChallenge>> keyList = new ArrayList<>();
List<Key<MXChallenge>> searchInKeys = ofy().load().type(MXChallenge.class).keys().list();
for(Long id : alreadyRetrieved){
keyList.add(Key.create(MXChallenge.class, id));
}
searchInKeys.removeAll(keyList);
QueryResultIterator<MXChallenge> iteratorChallenges = ofy().load()
.type(MXChallenge.class).filter("colour", "blue").filterKey("IN", searchInKeys).iterator();
虽然我不确定性能如何,但由于它是一个 "keys-only" 操作,所以我认为它应该没问题。
假设我有一个名为 EntityA 的实体种类,并且我有一个 EntityA id 列表。我如何从我的数据库中查询所有 EntityA 实体,而这些实体的 ID 不在我拥有的 EntityA ID 列表中?
我正在尝试做类似的事情:
ofy().load().type(EntityA.class).filter("!IN", entityAKeys);
我怎样才能让它工作?可能吗?
不,这不受支持,因为 Cloud Datastore 仅允许索引支持的查询以确保它们不会随着数据集扩展而中断。
您将不得不查询 kind EntityA 中的所有实体,并自行在客户端过滤掉 entityAKeys 中的实体。
所以我最后做了这样的事:
List<Key<MXChallenge>> keyList = new ArrayList<>();
List<Key<MXChallenge>> searchInKeys = ofy().load().type(MXChallenge.class).keys().list();
for(Long id : alreadyRetrieved){
keyList.add(Key.create(MXChallenge.class, id));
}
searchInKeys.removeAll(keyList);
QueryResultIterator<MXChallenge> iteratorChallenges = ofy().load()
.type(MXChallenge.class).filter("colour", "blue").filterKey("IN", searchInKeys).iterator();
虽然我不确定性能如何,但由于它是一个 "keys-only" 操作,所以我认为它应该没问题。