2013-09-30 9 views
2

我在MongoDB數據庫兩個集合:「照片」和「專輯」。遍歷多個集合使用Node.js的驅動程序和結果進行比較

在專輯集合中的每個文件包含一個「圖像」屬性包含IDS這是一個關鍵的回照片集的數組。

使用Node.js的司機,我需要遍歷專輯收集和刪除孤兒的圖像,這是不以任何專輯,即圖像。

我似乎無法推測出來......這是我寫

var MongoClient = require('mongodb').MongoClient; 

MongoClient.connect('mongodb://localhost:27017/photosharing', function(err, db) { 
    if(err) throw err; 

    var images = db.collection('images'); 
    var albums = db.collection('albums'); 
    var myArray = []; 

    db.albums.count({}, function(err, count) { 
     if(err) throw err; 
     console.dir("start length of albums is " + count); 
    }); 

    images.find({}).toArray(function(err, docs) { 
     if(err) throw err; 

     for (var i=1; i<=docs.length; i++) { 

      albums.count({"images": i}, function(err, count) { 
       if(err) throw err; 

       if (count == 0) { 
        images.remove({images.find({ "_id": i })}) 
       } 
      }); 

     };  
    }); 

    db.albums.count({}, function(err, count) { 
     if(err) throw err; 
     console.dir("end length of albums is " + count); 
    }); 

    db.close(); 

    }); 
+1

什麼是錯誤?看起來你的'起始長度'/'結束長度'部分有一些不同步的問題,但這不應該影響它是否起作用。 –

回答

1

下面的代碼是代碼,做你所需要的。

不過,我會向你推薦先試幾次,然後嘗試另一種少數,請別人幫忙之前,因爲它似乎你已經嘗試了一個辦法 - 沒有工作,也沒有嘗試過其他的選擇,而在開發中,總是有很多方法來實現「相同」的事情。

var MongoClient = require('mongodb').MongoClient; 

MongoClient.connect('mongodb://localhost:27017/photosharing', function(err, db) { 
    if(err) throw err; 

    var images = db.collection('images'); 
    var albums = db.collection('albums'); 
    var imageIds = [ ]; 
    var imageIdKeys = { }; 

    albums.find({ }).toArray(function(err, data) { 
    if (!err) throw err; 

    for(var i = 0; i < data.length; i++) { 
     for(var n = 0; n < data[i].images.length; n++) { 
     if (!imageIdKeys[data[i].images[n]]) { 
      imageIdKeys[data[i].images[n]] = true; 
      imageIds.push(data[i].images[n]); 
     } 
     } 
    } 

    images.remove({ _id: { $nin: imageIds } }, function(err) { 
     if (!err) throw err; 

     db.close(); 
    }); 
    }); 
}); 

它將收集所有圖像的ID,防止重複的ID。這也可以通過更好的方式使用聚合來完成,但我決定使用node.js邏輯來收集ID。然後它將刪除images集合中的所有文檔,其ID爲imageIds數組中未提及的ID。

而且畢竟只有完成 - 關閉數據庫連接。