node.js - Google Datastore 组合(联合)多组实体结果以实现 OR 条件

标签 node.js google-app-engine google-cloud-datastore

我正在 Google App Engine 上使用 NodeJS 和 Datastore 数据库。

由于 Datastore does not have support the OR operator ,我需要运行多个查询并合并结果。

我计划运行多个查询,然后将结果合并到单个实体对象数组中。我已经有一个查询正在运行。

问题:组合 Datastore 返回的两个(或多个)实体集(包括重复数据删除)的合理有效方法是什么?我相信这将是集合论方面的“并集”运算。

以下是基本查询大纲,将使用一些不同的过滤器运行多次,以实现所需的 OR 条件。

  //Set requester username
  const requester = req.user.userName;
  //Create datastore query on Transfer Request kind table
  const task_history = datastore.createQuery('Task');
  //Set query conditions
  task_history.filter('requester', requester);
  //Run datastore query
  datastore.runQuery(task_history, function(err, entities) {
    if(err) {
      console.log('Task History JSON unable to return data results. Error message: ', err);
      return;
      //If query works and returns any entities
    } else if (entities[0]) {
      //Else if query works but does not return any entities return empty JSON response
      res.json(entities); //HOW TO COMBINE (UNION) MULTIPLE SETS OF ENTITIES EFFICIENTLY?
      return;
    }
  });

这是我的原始帖子:Google Datastore filter with OR condition

最佳答案

恕我直言,最有效的方法是在第一阶段使用仅键查询,然后将获得的键组合到单个列表中(包括重复数据删除),然后仅通过键查找来获取实体。来自 Projection queries :

Keys-only queries

A keys-only query (which is a type of projection query) returns just the keys of the result entities instead of the entities themselves, at lower latency and cost than retrieving entire entities.

It is often more economical to do a keys-only query first, and then fetch a subset of entities from the results, rather than executing a general query which may fetch more entities than you actually need.

Here's how to create a keys-only query:

const query = datastore.createQuery()
  .select('__key__')
  .limit(1);

此方法解决了您在尝试直接组合通过常规非键查询获取的实体列表时可能遇到的几个问题:

  • 您无法正确消除重复,因为您无法区分具有相同值的不同实体和出现在多重查询结果中的相同实体之间的差异
  • 按属性值比较实体可能很棘手,而且肯定比仅比较实体键更慢/计算成本更高
  • 如果您无法在单个请求中处理所有结果,则在未实际使用的情况下读取它们会产生不必要的数据存储成本
  • 当仅处理实体键时,在多个请求中拆分实体处理(例如通过任务队列)要简单得多

也有一些缺点:

  • 它可能会慢一些,因为您要访问数据存储两次:一次用于获取键,一次用于获取实际实体
  • 您无法通过非仅键投影查询来获取所需的属性

关于node.js - Google Datastore 组合(联合)多组实体结果以实现 OR 条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47437166/

相关文章:

java - 将 Appengine 应用程序从旧的 Google 插件迁移到 Google 工具时如何修复错误?

node.js - "npx tsc --version"报告虚拟机内不同的 TypeScript 版本

javascript - rails Assets 管道 javascript "SyntaxError: Unexpected token export"

javascript - 如何在浏览器中显示回调响应

java - 如何设置 IntelliJ Java App Engine 项目以使用服务(模块)

google-app-engine - 如何激活 App Engine 上的交互式控制台?

google-app-engine - 谷歌应用引擎( Spring 启动)本地测试与数据存储给出未经身份验证的错误

node.js - 使用 nginx 的 Websocket 代理不适用于 tomcat。

java - 为什么托管 VM 禁用 OAuth?

google-app-engine - 删除 GAE 数据存储中的所有数据