无法通过 mongoose 删除 mongo 数据库

Posted

技术标签:

【中文标题】无法通过 mongoose 删除 mongo 数据库【英文标题】:Can't drop mongo database through mongoose 【发布时间】:2016-07-02 17:38:01 【问题描述】:

我正在尝试使用 mongoose 删除整个数据库。我在这里尝试过this 回答,但它只建议删除单个集合,而不是实际回答问题。

我尝试制作一个示例 javascript 来看看有什么问题:

var url = 'mongodb://localhost:27017/ngl_dev'
var mongoose = require('mongoose');
mongoose.connect(url);

// Trying to drop the entire database, doesn't work
/*
mongoose.connections[0].db.dropDatabase(function(err)
    if(err)
        console.log(err);
    
    console.log("Database dropped");
);
*/

// But dropping individual collections does.
/*
mongoose.connections[0].collections.TestTypes.drop(function(err)
    if(err)
        console.log(err);
    
    console.log('Collection dropped');
);
*/

// I can drop the entire database using mongodb module, but I don't have
// access to it in my production code, so this is just an example.
/*
var mongo = require('mongodb').MongoClient;
mongo.connect(url, function(err, db)
    if(err)
        console.log(err);
    
    console.log('Connected to the server');
    db.dropDatabase();
    console.log('Dropped database');
    db.close();
);
*/

当我取消注释第一部分时,没有任何反应,脚本挂起,集合中的所有数据和集合本身仍然存在,这与我运行该函数所期望的结果相反。

当我取消注释第二部分时,我收到一条错误消息,指出集合 TestType 未定义,我想这是有道理的,因为我没有使用应用程序中提供的猫鼬模式。因此,当我运行相同的代码并需要正确的模式时,collection dropped 被打印到控制台,指定集合中的数据被删除,但集合本身仍然存在并且脚本挂起。

当我取消注释第三部分时,指定的数据库实际上会被删除,这就是我期望在第一部分代码中发生的情况。但是,此脚本正在生产代码的不同部分中运行,该部分无法直接访问 mongodb 模块,因此这只是表明 mongoose 无法正常工作的示例。

如何让 mongoose 使用 dropDatabase() 函数删除整个数据库?

基本上我想要做的是将使用 mongo shell 的 bash 脚本替换为跨平台工作的东西。

【问题讨论】:

所以mongoose.connection 会给你一个点来引用底层驱动程序对象,但是 mongoose 的工作方式意味着在发生实际导致的事情之前不一定定义连接与数据库的连接。 “确保”连接的安全方法是将所有代码放在事件处理程序mongoose.connection.once("open", function() //code using underlying driver directly ) 所以 dropDatabase 基本上是一个空操作? 我不是这么说的。您需要在调用底层驱动程序方法“之前”确保连接到位。猫鼬模型上的方法实际上是在“幕后”做到这一点的。所以mongoose.connect()实际上并没有“连接”,它只是为实际建立连接的时候设置连接信息。因此,mongoose.connection.once("open",function()) 实际上是在“真正”建立连接时触发的。然后使用驱动程序引用是安全的。 【参考方案1】:

你不能随心所欲,但你可以

for (var collection in mongoose.connection.collections)
    collection.drop( function(err) 
        console.log('collection dropped');
    );

【讨论】:

那么如果 db.dropDatabase() 不起作用,它的意义何在?这听起来像是一个应该报告的错误。 当然你可以引用db对象。这只是底层节点驱动程序的另一个引用。

以上是关于无法通过 mongoose 删除 mongo 数据库的主要内容,如果未能解决你的问题,请参考以下文章

无法通过 Mongo(mongoose)中的点符号搜索子文档 [重复]

无法通过 Mongo(mongoose)中的点符号搜索子文档 [重复]

无法使用带有 X509 用户的 mongoose 连接到 Mongo DB

我无法使用 mongo / mongoose / NO METEOR 设置 react apollo mongodb app => 解析器

mongo+mongoose+express

nodejs+express+mongoose无法获取数据库数据问题解决