2016-06-22 13 views
0

Ich bekomme keine Ergebnisse von verschachtelten Abfrage, loc ist immer Null. Der Abfrageparameter hat den richtigen Wert, wenn ich ihn drucke, und die Datenbanksammlung "Benutzer" enthält Dokumente mit IDs aus dem Array friendsP.Mongodb geschachtelte Abfrage mit Knoten js

var acquireFriendsPositions = function(db, id, res, callback) { 
    var cursor = db.collection('users').find({"_id" : new ObjectId(id)}, {_id:0, friends:1}); 
    cursor.each(function(err, doc) { 
     assert.equal(err, null); 
     if (doc != null) { 
     friendsP = doc.friends; 
     console.log(friendsP); //I get the array friendsP 
     for(var i =0; i<friendsP.length; i++) 
     { 
      console.log(friendsP[i]); //friendsP[i] has proper value 
      var curs = db.collection('users').find({"_id" : new ObjectId(friendsP[i])}); //but query returns null 
      curs.each(function(err, loc) { 
      //assert.equal(err, null); 
      if(loc!= null) { 
       console.log(loc); 
       friendsPos.push(loc); 
       } 
       else { 
       console.log("else"); 
       } 
      }); 
     } 
     promise(friendsPos, res); //here i wait for friendsPos and use it in res.send(), but friendsPos is empty because loc is always null 
     } else { 
     callback(); //callback does db.close(); 
     } 
    }); 
}; 

Antwort

0

Wenn dies der genaue Code, den Sie verwenden Ich vermute, dass der friendsP Wert wird im nächsten Zyklus each gehisst und überschrieben. Das bedeutet, dass Sie dies beheben können, indem Sie einfach den Code in var friendsP = doc.friends ändern, damit die Variable friendsP im Funktionsumfang ist. Wenn dies der Fall ist, ist dies ein unangenehmer Fehler und Sie sollten die Variablen immer mit einem lokalen Gültigkeitsbereich deklarieren, um dies zu verhindern.

+0

Danke Vasil, aber es ist das gleiche mit der lokalen Variablen friendsP. Außerdem enthält der Cursor nur ein Dokument, da ich nach ID abfrage. Sieht so aus, als müsste ich dbref? –

0

Versuchen Sie, diese für das Gießen Objekt mit Id:

var mongodb = require('mongodb'); 

mongodb.ObjectID.createFromHexString(friendsP[i]); 
0

Danke, Jungs. Eigentlich war das Problem callback(), das die Verbindung vor der Ausführung der Abfragen beendete. Hier ist mein neuer Code:

var acquireFriendsPositions = function(db, id, res, callback) { 
    db.collection('users').findOne({"_id" : new ObjectId(id)}, 
    function(err, item) { 
    var friendsP = item.friends; 
    var locFriends = []; 
    promise(locFriends, res); 
    var x = 0; 
    for(i =0; i<friendsP.length; i++) 
    { 
     db.collection('users').findOne({"_id" : friendsP[i]}, function(err,subItem){ 
     x=x+1; 
     //console.log(subItem); 
     locFriends.push(subItem); 
     if(x==friendsP.length) 
      callback(); 
     }); 
    } 
    }); 
}; 
Verwandte Themen