我正在与谷歌应用引擎上的NodeJS与数据存储数据库。
由于Datastore不支持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;
}
});
3条答案
按热度按时间9wbgstp71#
恕我直言,最有效的方法是在第一阶段使用Keys-only查询,然后将获得的键组合成一个列表(包括重复数据删除),然后通过简单的键查找获得实体。
仅键查询
仅键查询(一种投影查询)只返回结果实体的键,而不是实体本身,与检索整个实体相比,延迟和成本更低。
通常,首先执行仅关键字查询,然后从结果中获取实体子集比执行常规查询更经济,因为常规查询可能获取比实际需要更多的实体。
以下是创建仅限键的查询的方法:
此方法解决了在尝试直接合并通过常规非仅键查询获得的实体列表时可能遇到的几个问题:
也有一些缺点:
z8dt9xmd2#
下面是我根据已接受答案中提供的建议创建的解决方案。
lf5gs5x23#
我只是想写信给那些偶然发现这个的人...
There is a workaround for some cases of not having the
OR
operator if you can restructure your data a bit, using Array properties: https://cloud.google.com/datastore/docs/concepts/entities#array_properties来自文档:
例如,在使用等式过滤器执行查询时,数组属性可能会很有用:如果实体的任何属性值与过滤器中指定的值匹配,则实体满足查询。
因此,如果您需要查询具有多个潜在值之一的所有实体,将每个实体的所有可能性放入Array属性,然后为查询索引它,应该会产生您想要的结果。(但是,您需要维护该附加属性,或者如果该Array实现可以满足您的所有需要,则用该Array实现替换现有属性。)