使用Node.jS驱动程序在MongoDB中迭代多个集合,并比较结果

我在MongoDB数据库中有两个集合:“照片”和“相册”。

相册集合中的每个文档都包含一个“images”属性,其中包含一个ID数组,这些ID是照片集合的关键字。

使用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(); }); 

这里是你所需要的代码。

但是,我会build议你先尝试几次,然后再尝试几次,然后再问别人的帮助,因为你似乎已经尝试了一种方法 – 没有工作,没有尝试其他select,而在开发中总是有很多方法来实现“相同”的事情。

 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。 然后,它将删除imageIds数组中未提及的具有ID的images集合中的所有文档。

只有在完成之后 – closures数据库连接。