2

MongoDB データベースに「写真」と「アルバム」の 2 つのコレクションがあります。

アルバム コレクション内の各ドキュメントには、写真コレクションへのキー バックである ID の配列を含む「images」プロパティが含まれています。

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

これは、必要なことを行うコードです。

しかし、私はあなたが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

そして、すべてが完了した後でのみ、データベース接続を閉じます。

于 2013-09-30T14:03:20.093 に答える