使用Mongoose删除索引的推荐方法是什么?

时间:2012-10-22 15:21:56

标签: javascript node.js mongodb mongoose database

我需要为MongoDB数据库创建几个部署脚本,如数据迁移和fixture,我找不到有关如何使用Mongoose API删除索引的足够信息。使用官方MongoDB API时,这非常简单:

  

删除指定集合上的所有索引:

  db.collection.dropIndexes();

但是,我想使用Mongoose,我尝试使用从this post改编的executeDbCommand,但没有成功:

mongoose.connection.db.executeDbCommand({ dropIndexes: collectionName, index: '*' },
  function(err, result) { /* ... */ });

我是否应该使用官方的MongoDB API for Node.js,或者我错过了这种方法的一些内容?

4 个答案:

答案 0 :(得分:23)

要通过集合的Mongoose模型执行此操作,您可以调用本机集合的dropAllIndexes

MyModel.collection.dropAllIndexes(function (err, results) {
    // Handle errors
});

<强>更新

2.x版本的本机驱动程序中不推荐使用

dropAllIndexes,因此应使用dropIndexes代替:

MyModel.collection.dropIndexes(function (err, results) {
    // Handle errors
});

答案 1 :(得分:1)

看起来您正在尝试删除给定集合上的所有索引。

根据MongoDB文档,this is the correct command

  

...我尝试使用从这篇文章改编的executeDbCommand,但没有成功:

要真正提供帮助,我们需要更多详细信息:

  • 失败了什么?你是如何衡量“没有成功”的?
  • 您能100%确认该命令已运行吗?你输出回调中的日志了吗?您检查了err变量吗?
  • 你在哪里创建索引?你可以确认你在放弃后没有重新创建它们吗?
  • 您是否在列出特定索引名称时尝试过该命令?老实说,你不应该使用"*"。您应该删除并创建非常具体的索引。

答案 2 :(得分:0)

如果要使用mongoose维护模式定义中的索引(如果使用mongoose,则可能需要这样做),可以轻松删除不再使用的索引,并创建尚不存在的索引。您只需在await YourModel.syncIndexes()上运行一个需要同步的模型即可。它将使用.ensureIndexes在后​​台创建一个,并删除模式定义中不再存在的任何内容。您可以在此处查看完整的文档: https://mongoosejs.com/docs/api.html#model_Model.syncIndexes

答案 3 :(得分:-1)

删除您可以使用的特定索引

db.users.dropIndex("your_index_name_here")