当前位置: 首页 > 面试题库 >

Google数据存储区合并(联合)多组实体结果以达到OR条件

吴伟志
2023-03-14
问题内容

我正在使用带有数据存储数据库的Google App Engine上的NodeJS。

由于数据存储区不支持OR运算符,因此我需要运行多个查询并合并结果。

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

问题:将数据存储区返回的两套(或多套)实体(包括重复数据删除)组合在一起的合理有效方式是什么?我相信这将是集合论的“联合”行动。

这是基本查询大纲,将使用一些不同的过滤器多次运行以实现所需的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;
    }
  });

问题答案:

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

仅键查询

仅键查询(这是投影查询的一种)仅返回结果实体的键,而不是实体本身,因此其延迟和成本比检索整个实体要低。

通常,先执行仅键查询,然后从结果中获取实体的子集,而不是执行可能会获取比实际需要更多的实体的一般查询,这样比较经济。

以下是创建仅键查询的方法:

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

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

  • 您无法正确进行重复数据删除,因为您无法区分具有相同值的不同实体与出现在乘法查询结果中的相同实体之间的差异
  • 通过属性值比较实体可能会比较棘手,并且绝对比仅比较实体键要慢/更多的计算开销
  • 如果您无法在一个请求中处理所有结果,那么您将花费不必要的数据存储成本来读取它们,而无需实际使用它们
  • 仅处理实体键时,将实体的处理拆分为多个请求(例如,通过任务队列)要简单得多

也有一些缺点:

  • 这可能会有点慢,因为您要两次访问数据存储区:一次是输入密钥,一次是获取实际实体
  • 您不能利用仅通过非键的投影查询来获取所需属性的优势


 类似资料:
  • 问题内容: 我喜欢这样的查询: 在ORMlite中,可以使用以下代码: 如果可以事先知道条件,并且在编码时就可以了,那么我需要动态添加条件。 基本上,这种方法是不够的。它需要其他支持的方法的条件。 感谢您的任何建议。 问题答案: 如果可以事先知道条件,并且在编码时就可以了,那么我需要动态添加条件。 在ORMLite 中有一点语法上的缺陷。您打电话的时候: 该方法得到的是: 您确实可以将其重写为:

  • 我有索引,其中每个文档都有这样的结构: 我需要计算每个演员对应的电影数量(演员可以在actor_1_name、actor_2_name或actor_3_name字段中) 这3个字段的映射是: 有没有一种方法,我可以聚合的结果,可以结合所有3个演员领域的条款,并给出一个单一的聚合。 目前,我正在为每个actor字段创建单独的聚合,并通过我的JAVA代码将这些不同的聚合合并成一个。 通过创建不同的聚合

  • 请帮我解决这个问题:我正在尝试在openam中设置一个idp和一个sp的联合。正在使用的数据存储是ApacheDS。我正试图按照以下教程进行同样的学习。 http://fczaja.blogspot.com/2012/06/idp-initiated-sso-and-identity.html 在测试联盟连接期间(从控制台),我在openam日志中收到以下错误** 这可能意味着openam试图使用

  • 问题内容: 情况: 用户想使用Youtube的JSON API在JQuery网站中导入Youtube播放列表。 问题: Youtube仅返回前50个条目,但是播放列表的长度可能超过100个条目(长度由JSON响应中的“ totalItems”给出)。所有条目都需要合并为1个对象,最后需要将其推入到输出函数中。 条目1-50:http : //gdata.youtube.com/feeds/api/

  • 问题内容: 我从elasticsearch开始,并且一直试图进行一些聚合。基本上,我有一个数据集,包含以下形式的数据: 现在,我想进行一些汇总,并在一个查询中获得所有的Continental餐馆,Good餐馆,New York餐馆。 请注意,我不希望统计所有类型的餐厅,而只希望统计特定类型的餐厅。而且,这些聚合是相互独立的。就是说,当我说“好”时,我并不一定要它是“大陆”,它可以是意大利语或其他任

  • 我需要合并两个数据帧。为了确保行是唯一的,我需要在合并之前验证“Name”和“Age”是否匹配。我将组合用作主键。这是我的密码: 当我使用多个键(“姓名”和“年龄”)时,这是一个“和”或“或”匹配。我只希望它在“Name”和“Age”匹配时合并,而不是只在“Name”或“Age”匹配时合并。我似乎在文档中找不到这一点,我得到了一些混合的结果。 更新:由于数据原因,我确实需要进行左连接。右边的表是我