我有一个数据存储,其中包含大约150,000个实体.当我使用过滤器查询商店时,我的查询真的很慢.我的结构是完全平坦的,即每个实体都是彼此的兄弟.
1:使用GQL代替过滤器更好吗?
2:这不是Data Store的最佳用例,我应该使用SQL数据库吗?
这是我的代码示例:
// Look for a buy opportunity
dateFilter = new FilterPredicate("date", FilterOperator.EQUAL, dt);
scoreFilter = new FilterPredicate("score", FilterOperator.LESS_THAN_OR_EQUAL, 10.0);
safetyFilter = new FilterPredicate("score", FilterOperator.GREATER_THAN_OR_EQUAL, -1.0);
mainFilter = CompositeFilterOperator.and(dateFilter,scoreFilter,safetyFilter);
q = new Query("StockEntity",stockKey).setFilter(mainFilter);
q.addSort("score", Query.SortDirection.ASCENDING);
stocks = datastore.prepare(q).asList(FetchOptions.Builder.withLimit(availableSlots));
Run Code Online (Sandbox Code Playgroud)
更多细节:
150,000个记录,分为500个股票,每个股票约300个记录,日期范围内每天一个.
如上所述查询,其中传递了特定日期,并且基于"得分"有效地过滤了500个股票,期望返回的记录数量在10到20之间需要超过30秒才能完成,在我的开发机器.
还没有尝试推动生产,但我想我会尝试下一步 - 我认为不会有巨大的差异.我的开发机器是一个相当高的规格iMac.
我有一个GAE数据存储表,其中包含一个数组字段(包含几个字符串).我想基于包含特定字符串的所有数组字段来过滤此表.我怎样才能做到这一点 ?我没有在GQL中看到'包含'运算符,而'in'运算符则以相反的方式运行.我只需要遍历所有实体并自己进行检查吗?
(PS我在GAE工作中使用Python).
经过几天的阅读应用程序引擎和数据存储的文档后,我似乎无法理解如何构建一个真实的可伸缩应用程序.
我也找不到最佳实践的好例子.确定我可以使我的应用程序工作,但我不知道是否有利于扩展到我的开发环境可以提供的负载以上.
它清楚地说明了使用数据存储区的应用程序引擎教程:"但是,您可以写入同一实体组的速率限制为每秒写入实体组一次.当您设计一个真实的应用程序时,你'我需要记住这个事实."
假设我理解的内容(请纠正我,如果我错了),假设数据存储根是/ then/Users/*(Keys)是实体组而/ Products/Beauty/*是受实体组影响的实体组之前的限制为每秒1次写入.(是/产品/美容/*受限于/ Products/*以及?)
我错过了解这个吗?
让我们假设我们想要构建一个真实的聊天应用程序或购物应用程序.这些应用程序必须存储用户将在应用程序上执行的许多操作的数据.比如发送消息或评论产品或删除/添加/编辑产品.
鉴于这些操作,数据存储应该如何?当然,我们无法将消息存储为/ Messages/{Message,To,From,Timestamp},因为许多用户将发送必须写入此密钥的消息.另一种方法是每秒限制用户每1条消息并将其存储在他的配置文件/ Users/{USER}/{Message,To,From,Timestamp}中,但只有一个用户可以写入该实体组.所以我们可以把它们放在根目录上:/ {USER}/{Message,To,From,Timestamp}但是它被认为是一个好习惯吗?是否足够快速查询数据存储区以获取用户之间的所有消息?(有效吗?可能吗?)
另一种方法是将所有内容存储在数据存储区的根目录中,作为"消息"和"用户","产品"和"类别"(例如,产品中将包含类别引用).
我找到了这些代码示例,但我没有工具或想法如何知道这些是否是规模的任何良好实践?
谢谢!
我已经使用Google端点创建了一个方法并将其公开.我想要的只是从Google DataStore保存和检索数据.
当我尝试使用API Explorer进行测试时,出现以下错误 -
java.lang.NoSuchMethodError
我已附上以下代码
@ApiMethod (name ="mTest")
public void mTest(@com.google.api.server.spi.config.Named("UName") String UName) throws IOException {
DatastoreService datastoreService;
datastoreService = DatastoreServiceFactory.getDatastoreService();
Transaction tx=datastoreService.beginTransaction();
try {
Key userKey = KeyFactory.createKey("USERS_PK", UName);
Entity userEntity=new Entity("M_USERS",userKey);
userEntity.setProperty("TestColumn","TestColumnValue");
datastoreService.put(userEntity);
tx.commit();
}finally {
if (tx.isActive()){
tx.rollback();
}
}
}
Run Code Online (Sandbox Code Playgroud)
在datastoreService.put(userEntity)上遇到错误 ;
请在下面找到堆栈跟踪:
Jun 29, 2014 5:12:20 PM com.google.api.server.spi.SystemService invokeServiceMethod
INFO: cause={0}
java.lang.NoSuchMethodError: com.google.appengine.api.datastore.Key.getAppIdNamespace()Lcom/google/appengine/api/datastore/AppIdNamespace;
at com.google.appengine.api.datastore.KeyTranslator.convertToPb(KeyTranslator.java:49)
at com.google.appengine.api.datastore.EntityTranslator.convertToPb(EntityTranslator.java:50)
at com.google.appengine.api.datastore.AsyncDatastoreServiceImpl$4.toPb(AsyncDatastoreServiceImpl.java:203)
at com.google.appengine.api.datastore.AsyncDatastoreServiceImpl$4.toPb(AsyncDatastoreServiceImpl.java:180)
at com.google.appengine.api.datastore.Batcher$BatchIterator.<init>(Batcher.java:177)
at com.google.appengine.api.datastore.Batcher$2.<init>(Batcher.java:312)
at com.google.appengine.api.datastore.Batcher.getBatches(Batcher.java:312)
at com.google.appengine.api.datastore.AsyncDatastoreServiceImpl.doBatchPut(AsyncDatastoreServiceImpl.java:536) …Run Code Online (Sandbox Code Playgroud) google-app-engine android google-cloud-datastore android-studio
我在Cloud Datastore中存储了大约一百个对象Kind= Animal.我想Animal通过低级API或Objectify从数据库中获取所有内容.
我想使用mapreduce库来更新满足查询的所有实体.有几个并发症:
我知道如何将csv文件上传到Blobstore并使用Blobstore输入阅读器读取每一行.我也知道使用查询获取实体的数据存储区输入阅读器.
我的问题是如何创建一个Mapper类,从Blobstore读取输入数据,获取数据存储区实体并尽可能高效地更新它们?
java google-app-engine mapreduce blobstore google-cloud-datastore
开发使用Google Plaform的企业级移动应用程序(android/iOS/Web) - appengine,云端点,云存储,数据存储等.
是否在中国关闭了Google服务:
如果不是,我们可以
如何利用Google服务(GAE,GCS)在中国运营?他们使用AWS吗?
谢谢
google-app-engine mobile-application google-cloud-storage google-cloud-endpoints google-cloud-datastore
我想了解在线文档中未提及的Google AppEngine数据存储中找到的父/子(祖先路径)关系.父母被删除后,子对象会发生什么?子对象也会被删除吗?没有父母,他们会成为孤儿吗?如果是这样,你会如何查询它们?
有关Ancestor路径的Google帮助文档:https: //cloud.google.com/appengine/docs/go/datastore/entities#Go_Ancestor_paths
谢谢!〜托德
我正在尝试执行数据流管道作业,该作业将从数据存储区一次对N个条目执行一个函数.在我的情况下,此函数将一批100个条目作为有效负载发送到某些REST服务.这意味着我想要查看来自一个数据存储区实体的所有条目,并一次将100个批处理条目发送到某些外部REST服务.
我目前的解决方案
上面描述的伪代码场景(忽略细节):
final int BATCH_SIZE = 100;
// 1. Read input from datastore
pipeline.apply(DatastoreIO.readFrom(datasetId, query))
// 2. create keys to be used in group by so we get iterator in next task
.apply(ParDo.of(new DoFn<DatastoreV1.Entity, KV<String, EntryPOJO>>() {
@Override
public void processElement(ProcessContext c) throws Exception {
String key = generateKey(c);
EntryPOJO entry = processEntity(c);
c.output(KV.of(key, entry));
}
}))
// 3. Group by key
.apply(GroupByKey.create())
// …Run Code Online (Sandbox Code Playgroud) dataflow google-cloud-datastore gcloud google-cloud-dataflow
假设有两个文件
/orgs/foo
/users/alice
Run Code Online (Sandbox Code Playgroud)
和/users/alice具有基准型场org其引用/orgs/foo.
/orgs/foo应该是可以访问的request.auth.uid == 'alice'.我怎样才能做到这一点?
我想这是这样的,但我无法弄明白.换句话说,我如何获取引用文档的ID?
function isOrgMember(orgId) {
return get(/databases/$(database)/documents/users/$(request.auth.uid)).data.org.__id__ == orgId;
}
match /orgs/{orgId} {
allow read: isOrgMember(orgId);
}
Run Code Online (Sandbox Code Playgroud)