我正在 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;
}
});
最佳答案
恕我直言,最有效的方法是在第一阶段使用仅键查询,然后将获得的键组合到单个列表中(包括重复数据删除),然后仅通过键查找来获取实体。来自 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/