在放入mongoose之前检查收集是否存在

当调用drop()时集合不存在时,会抛出一个错误:

ns找不到

目前我正在使用类似的东西

 try { await MongooseModel.collection.drop(); } catch (err) { if (err.message !== 'ns not found') { throw err; } } 

这味道不太好 我们并不清楚为什么首先会抛出一个错误,如果drop()不存在就会返回false ,就像在Mongo控制台中那样。

当只有对Mongoose模型MongooseModel的引用时,如何做到这一点?

我没有在我正在做这个地方的连接对象的引用,就像在这个答案中build议的一样。

其实你有参考。 连接build立后,您可以随时mongoose.connection并返回当前连接。

您也可以简单地从任何模型实例中获取db 。 所以,如果您不想在集合不存在时.listCollections()错误,则可以使用一种方法,即基本上使用基础驱动程序中的.listCollections()方法来查看您想要的集合访问实际上首先存在于命名空间中:

 const mongoose = require('mongoose'), Schema = mongoose.Schema; mongoose.Promise = global.Promise; mongoose.set('debug',true); const uri = 'mongodb://localhost/blank', options = { useMongoClient: true }; const testSchema = new Schema({},{ strict: false }); const ModelA = mongoose.model('ModelA', testSchema); const ModelB = mongoose.model('ModelB', testSchema); (async function() { try { const conn = await mongoose.connect(uri,options); await ModelB.create({ a: 1 }); for ( let model of [ModelA,ModelB] ) { let list = await model.db.db.listCollections({ name: model.collection.name }).toArray() //console.log(JSON.stringify(list,undefined,2)); if ( list.length !== 0 ) { await model.collection.drop(); } else { console.log('collection %s does not exist',model.collection.name); } } } catch(e) { console.error(e); } finally { mongoose.disconnect(); } 

会certificate,第一次尝试收集下降不存在,没有抛出一个错误:

 Mongoose: modelbs.insert({ a: 1, _id: ObjectId("59aa9cfe581cca7afac55181"), __v: 0 }) collection modelas does not exist Mongoose: modelbs.drop() 

还有其他的事情可以做,例如使用{ strict: true }从底层驱动使用.collection()来获得一个集合对象。 但是,这真的只是“抛出一个错误”。 因此,虽然在发布.drop()集合不存在之前您将“知道”,但它仍然是try..catch处理所需的。

所以没有错误,首先检查收集的存在。 当然,没有别的东西会去除它。 但是你可能应该总是error handling以防万一。


就我个人而言,我发现它只是简单的让exception发生,然后简单地检查细节,看看引发的exception是我所期望的:

 for ( let model of [ModelA,ModelB] ) { try { await model.collection.drop(); } catch (e) { if (e.code === 26) { console.log('namespace %s not found',model.collection.name) } else { throw e; } } } 

在这种情况下, code: 26代表"Namespace not found" ,在这种情况下会引发这个问题,或者在{ strict: true }方法中使用本地.collection()方法。 但是对集合对象使用现有句柄的.drop()要短得多。

要指出的是,没有什么要求您实际loggingexception,而“检查exception”(例如,批量插入中预期的重复键错误)是常见的做法。 只要testing预期的错误代码,并且“如果”返回了其他内容,则会在更高层次上引发exception。

如前所述,虽然“可以”假设如果你要求数据库按名称列出集合,并且在结果中存在,那么最安全的过程就是在I / O中仍然捕获任何exception是在“查询”和“操作”之间进行的一些其他修改。