【问题标题】:Google Datastore NodeJS combine (union) multiple sets of keys only resultsGoogle Datastore NodeJS 组合(联合)多组键仅结果
【发布时间】:2017-11-28 00:24:57
【问题描述】:

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

请注意,此问题是my original post 的扩展(不是重复)。

由于 Datastore 不支持 OR 运算符,我需要运行多个查询并合并结果。

这是我的方法(基于我原来帖子中选择的答案):

  1. 在第一阶段使用仅限键的查询
  2. 将获得的键组合成一个列表(包括去重)
  3. 简单地通过键查找获取实体

我通过使用异步并行模块运行两个单独的查询实现了 #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);
    }
  });
}

【问题讨论】:

    标签: node.js google-app-engine


    【解决方案1】:

    我能够通过遍历数组并比较每个实体键的 ID 值并使用唯一键创建一个新数组来组合两组单独的实体键。

    注意:完整的解决方案作为我的original post 的答案发布。

    //Union of two arrays of objects entity keys
    function unionEntityKeys(arr1, arr2) {
      var arr3 = [];
      for(var i in arr1) {
        var shared = false;
          for (var j in arr2)
            if (arr2[j][datastore.KEY]['id'] == arr1[i][datastore.KEY]['id']) {
              shared = true;
              break;
            }
          if(!shared) {
            arr3.push(arr1[i])
          }
        }
      arr3 = arr3.concat(arr2);
      return arr3;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-03-09
      • 2013-07-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多