【发布时间】:2017-11-28 00:24:57
【问题描述】:
我正在使用带有 Datastore 数据库的 Google App Engine 上的 NodeJS。
请注意,此问题是my original post 的扩展(不是重复)。
由于 Datastore 不支持 OR 运算符,我需要运行多个查询并合并结果。
这是我的方法(基于我原来帖子中选择的答案):
- 在第一阶段使用仅限键的查询
- 将获得的键组合成一个列表(包括去重)
- 简单地通过键查找获取实体
我通过使用异步并行模块运行两个单独的查询实现了 #1。我需要关于第 2 步的帮助。
问题:如何有效地将两个实体键列表组合(并集)成一个列表(包括去重)?
我下面的代码成功地执行了两个查询并返回了两个对象 getEntities.requesterEntities 和 getEntities.dataownerEntities。
//Requirement: Get entities for Transfer Requests that match either the Requester OR the Dataowner
async.parallel({
requesterEntities: function(callback) {
getEntitiesByUsername('TransferRequest', 'requester_username', loggedin_username, (treqs_by_requester) => {
//Callback pass in response as parameter
callback(null, treqs_by_requester)
});
},
dataownerEntities: function(callback) {
getEntitiesByUsername('TransferRequest', 'dataowner_username', loggedin_username, (treqs_by_dataowner) => {
//Callback pass in response as parameter
callback(null, treqs_by_dataowner)
});
}
}, function(err, getEntities) {
console.log(getEntities.requesterEntities);
console.log(getEntities.dataownerEntities);
//***HOW TO COMBINE (UNION) BOTH OBJECTS CONTAINING DATASTORE KEYS?***//
});
function getEntitiesByUsername(kind, property_type, loggedin_username, getEntitiesCallback) {
//Create datastore query
const treq_history = datastore.createQuery(kind);
//Set query conditions
treq_history.filter(property_type, loggedin_username);
treq_history.select('__key__');
//Run datastore query
datastore.runQuery(treq_history, function(err, entities) {
if(err) {
console.log('Transfer Request History JSON unable to return data results for Transfer Request. Error message: ', err);
} else {
getEntitiesCallback(entities);
}
});
}
【问题讨论】: