Mongoose,remove在聚合

时间:2015-12-06 06:55:04

标签: node.js mongodb mongoose

将Mongoose 4.2.9与MongoDB 3和以下数据集一起使用:

  • 数据库:test
  • 收藏集:imagesalbums

我正在尝试删除属于no albums的图片。

albums集合的示例文档:

> db.albums.findOne()
{
    "_id" : 0,
    "images" : [ 
        2433,
        2753,
        2983,
        6510,
        99334
    ]
}

此处images是来自_id集合的images数组。

images集合的示例数据:

> db.images.findOne()
{
    "_id" : 243,
    "height" : 480,
    "width" : 640
}

我使用node编写了以下代码来实现上述目标:

var mongoose = require('mongoose');

/* Construct Album model */
var albumSchema = mongoose.Schema({
    _id: Number,
    images: [Number]
});

var Album = mongoose.model('Album', albumSchema);

/* Construct Image model */
var imageSchema = mongoose.Schema({
    _id: Number
});

var Image = mongoose.model('Image', imageSchema);

mongoose.connect('mongodb://localhost/test');
var db = mongoose.connection;
db.on('error', console.error.bind(console, 'connection error'));
db.once('open', doTheJob);

/* Do the job */

function doTheJob () { 
    Image.find({}, function (err, images) {
        if (err) {
            throw err;
        }
        for(var i in images){
            (function (image) {
                Album.aggregate([
                    {
                        $unwind: "$images"
                    }, {
                        $group: {
                            _id: "$images"
                        }
                    }, {
                        $match: {
                            _id: image._id
                        }
                    }
                ])
                .exec(function (err, albums) {
                    if (err) {
                        throw err;
                    }

                    if (albums.length === 0) {
                        console.log(image._id);
                        Image.remove({_id: image._id}, function(err){
                            if (err) {
                                console.log(err);
                                throw err;
                            }
                            console.log("Removed " + image._id);
                        });

                        /* Also the following code does not work, image (with 
                         * lowercase 'i' is a doc that is returned by Image.find({}))                              
                        image.remove( function(err){
                            if (err) {
                                console.log(err);
                                throw err;
                            }
                            console.log("Removed " + image._id);
                        });
                        */

                    }
                });
            })(images[i]);
        }
    });
}

现在我的问题是 Image.remove()未被调用,因为在控制台中,我看不到错误,Removed XXX,我也在控制台中测试了文档。

我需要提一下,如果在同一个程序中,而不是doTheJob(),我只传递一个只有Image.remove({_id: XXX}, function () {})的回调,那么它就可以了。

1 个答案:

答案 0 :(得分:0)

我的问题是mongoose执行回调的顺序。

在执行程序之前,images集合有100,000个文档。当我运行该程序时,花了大约1个小时才完成,在此期间,remove()在40分钟后开始被调用/解雇,这是收敛点,让我觉得它们从未被调用过。