2017-11-28 1 views
0

Ich arbeite mit NodeJS auf Google App Engine mit der Datastore-Datenbank.Google Datastore NodeJS kombinieren (Vereinigung) mehrere Sätze von Schlüsseln nur Ergebnisse

Beachten Sie, dass diese Frage eine Erweiterung von (kein Duplikat) my original post ist.

Da Datastore den OR-Operator nicht unterstützt, muss ich mehrere Abfragen ausführen und die Ergebnisse kombinieren.

Hier ist mein Ansatz (bezogen auf die gewählte Antwort von meiner ursprünglichen post):

  1. Gebrauchs-Schlüssel-only-Abfragen in der 1. Stufe
  2. Führen Sie die Kombination der in einer einzigen Liste erhalten Tasten (einschließlich Deduplizierung)
  3. die Unternehmen, die lediglich durch Schlüsselsuche Erhalten

ich habe # 1 durch zwei getrennte Abfragen mit den Asynchron parallel Modul erreicht. Ich brauche Hilfe mit Schritt 2.

Frage: Wie kombiniert (Union) zwei Listen von Entitätsschlüsseln in eine einzige Liste (einschließlich Deduplizierung) effizient?

Der Code, den ich unten habe, führt beide Abfragen erfolgreich aus und gibt zwei Objekte zurück: getEntities.requesterEntities und 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); 
    } 
    }); 
} 

Antwort

0

I war in der Lage, die zwei getrennte Sätze von Entität Schlüssel zu kombinieren, indem über den Arrays iteriert und die ID-Werte für jede Entität Schlüssel vergleicht und ein neues Array mit den einzigartigen Schlüssel erzeugt wird.

Hinweis: Die komplette Lösung wird als Antwort auf meine original post geschrieben.

//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; 
} 
Verwandte Themen