簡體   English   中英

使用Node.jS驅動程序在MongoDB中迭代多個集合並比較結果

[英]Iterating multiple collections in MongoDB using the Node.jS driver and comparing results

我在MongoDB數據庫中有兩個集合:“照片”和“相冊”。

相冊集合中的每個文檔都包含一個“圖像”屬性,該屬性包含一個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();

  });

這是滿足您需求的代碼。

但是,我建議您先嘗試幾次,然后再嘗試幾次,然后再尋求其他人的幫助,因為您似乎已經嘗試過一種方式-沒用過,也沒有嘗試過其他選擇,而在開發中總是有很多實現“相同”事物的方法。

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數組中未提及的所有文檔。

而且只有完成所有操作后-關閉數據庫連接。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM