将Mongoose 4.2.9与MongoDB 3和以下数据集一起使用:
test
images
,albums
我正在尝试删除属于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 () {})
的回调,那么它就可以了。
答案 0 :(得分:0)
我的问题是mongoose执行回调的顺序。
在执行程序之前,images
集合有100,000个文档。当我运行该程序时,花了大约1个小时才完成,在此期间,remove()
在40分钟后开始被调用/解雇,这是收敛点,让我觉得它们从未被调用过。