迭代所有集合并删除它们

时间:2017-10-20 10:08:55

标签: javascript node.js mongodb mongoose

我有这段代码:

exports.cleanDB = function() {
  return mongoose.connection.db.dropDatabase();
};

由于这是一种弊端,我想迭代所有集合并想要调用

mongoose.connection.db.DateTime.remove();

每一个。

有人可以帮我创建代码和return语句吗?

在应用程序的另一部分类似代码,我不知道如何重写:

  exports.cleanDB = function*(req) {

    yield mongoose.connection.db.dropDatabase();

1 个答案:

答案 0 :(得分:3)

真的没有看到删除数据库有什么问题。但是,如果你真的必须那么你可以循环注册的模型并做.remove()

例如:

// Just similating an async wrapper
(async function() { 

  try {

    const conn = await mongoose.connect(uri,options);

    // Loop all registered models
    await Promise.all(
      Object.entries(conn.models).map(([k,m]) => m.remove())
    )

  } catch(e) {
    console.error(e)
  }

})()

或简单的承诺:

mongoose.connect(uri,options).then( conn => {

  Promise.all(
    Object.entries(conn.models).map(([k,m]) => m.remove())
  ).then( () => /* something */ )

})

如果您不支持Object.keys

,您甚至可以Object.entries()
mongoose.connect(uri,options).then( conn => {

  Promise.all(
    Object.keys(conn.models).map(k => conn.models[k].remove())
  ).then( () => /* something */ )

})

或者如果你真的必须,那么深入了解数据库级别并使用Db

中的.collections()方法擦除所有集合
(async function() { 

  try {

    const conn = await mongoose.connect(uri,options);

    // Get every collection in an array
    await Promise.all(
      (await conn.db.collections()).map( c => c.remove() )
    );

  } catch(e) {
    console.error(e)
  }

})()

或简单的承诺:

mongoose.connect(uri,options).then( conn => {

  conn.db.collections()
    .then( collections => Promise.all( 
      collections.map( c => c.remove() )
    )
    .then( () => /* something */ )

})

如果模型是否已注册,则无关紧要。

所以它实际上取决于您更愿意采用哪种方法,如果您已经处理过加载和注册每个模型的代码,那么使用已注册的模型就足够了。否则使用直接驱动程序方法来获取对数据库中当前所有集合的引用,确保即使模型尚未注册,它的集合仍然会删除所有内容。

请注意,Db.collections()基本上是Db.listCollections()输出的包装版本,它实际上是返回Collection个对象,而不仅仅是'名称'。