2

我在 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();

  });
4

1 回答 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 的文档,该 ID 未在imageIds数组中提及。

并且只有在完成之后 - 关闭数据库连接。

于 2013-09-30T14:03:20.093 回答