gpt4 book ai didi

MongoDB如何在操作完成后删除临时集合

转载 作者:可可西里 更新时间:2023-11-01 09:55:13 25 4
gpt4 key购买 nike

有时我会创建一个临时集合以将来自多个集合的数据聚合到一个集合中以进行报告。我需要在创建报告后立即删除此临时集合,以避免磁盘空间被来自许多报告请求的临时集合填满。

目前我从应用程序执行这个

db.dropCollection('tempCollection564e1f5a4abea9100523ade5');

但是每次运行的结果都不一致。有时集合删除成功,但有时集合失败并显示以下错误消息:

MongoError:异常:无法执行操作:当前正在为集合 databaseName.tempCollectionName 运行后台操作
代码:12587

在 MongoDB 中删除临时集合的最佳做法是什么?我目前使用 UUID 命名该集合以避免名称冲突,并且该集合仅在我尝试销毁临时集合之前使用过一次。

有没有办法检查集合的操作是否正在进行,然后在操作完成后删除集合?

注意:我认为这不是应用程序中 javascript 异步代码的问题。我在聚合查询完成后调用 dropCollection()

最佳答案

我最终创建了这个 mongoose 插件,它在生产环境中运行良好已有一年多了。我创建了一个临时集合,然后在 1 分钟后使用 setTimeout() 删除该集合。 1分钟足以查询集合,因此集合不再使用。

这会创建具有唯一名称的集合,例如 z_tempCollection_595820e4ae61ecc89635f794,因此永远不会发生名称冲突。

var mongoose = require('mongoose');
var _ = require('lodash');
var util1 = require(global.appRootPath + '/lib/util1_lib.js');

function tempCollection(persistantSchema){
persistantSchema.statics.resultIntoTempCollection = function (tempCollectionDataArray, options, callback) {
var timestampSeconds = Math.round(Date.now() / 1000);
var tmpCollectionName = 'z_tempCollection_' + (new mongoose.mongo.ObjectId().toString()) + '_' + timestampSeconds;
var registeredModelName = 'tempModel' + tmpCollectionName;
options = options || {};
options.strict = _.isUndefined(options.strict) ? false : options.strict;
options.schema = _.isUndefined(options.schema) ? {} : options.schema;
var tmpSchema = new mongoose.Schema(options.schema, {strict: options.strict, collection: tmpCollectionName});
tmpSchema.statics.removeTempCollection = function(tempModel){
var maxRemovalAttempts = 3;
delete mongoose.models[registeredModelName];
delete mongoose.modelSchemas[registeredModelName];
setTimeout(function(){
mongoose.connection.db.dropCollection(tmpCollectionName, function (err, result) {
if (err) {
util1.saveError(err, 'server', null);
}
});
}, 60 * 1000);
}
// tempModel variable ref is overwritten on each subsequent run of resultIntoTempCollection
var tempModel = mongoose.model(registeredModelName, tmpSchema);
var promises = [];
tempCollectionDataArray.forEach(function(doc){
promises.push(new tempModel(doc).save());
});
return Promise.all(promises).then(function(){
return tempModel;
});
}
}

module.exports = tempCollection;

关于MongoDB如何在操作完成后删除临时集合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33812850/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com