2017-11-28 8 views
0

Google App EngineでDatastoreデータベースを使用してNodeJSを使用しています。Google Datastore NodeJS複数のキーセットを組み合わせるだけの結果

この質問は、(重複しない)my original postの拡張であることに注意してください。

DatastoreはOR演算子をサポートしていないため、複数のクエリを実行して結果を結合する必要があります。ここで

は(私のオリジナルのポストから選択された回答に基づいて)私のアプローチである:第一段階

    1. 使うキーのみのクエリは、1つのリストに取得したキーの組み合わせを実行します(私は非同期並列モジュールを持つ2つの別々のクエリを実行することで第1位を達成しているだけで、キーのルックアップによって

    をエンティティを取得重複排除)

  • 含みます。手順2で助けが必要です。

    質問:エンティティキーの2つのリストを単一のリスト(重複除外を含む)に効率的に結合する方法はありますか?

    以下のコードは両方のクエリを正常に実行し、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); 
        } 
        }); 
    } 
    
  • 答えて

    0

    Iは、配列を反復し、各エンティティキーの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; 
    } 
    
    関連する問題