唯一索引不适用于 Mongoose / MongoDB

Posted

技术标签:

【中文标题】唯一索引不适用于 Mongoose / MongoDB【英文标题】:Unique index not working with Mongoose / MongoDB 【发布时间】:2011-08-21 05:33:06 【问题描述】:

我在使用 Mongoose / MongoDb 创建唯一索引时遇到问题,无法让它工作。设置唯一索引后,我可以添加两个具有相同属性值的文档。

我已经尝试了所有我能想到的 - 重新启动(一切)更改语法等。

代码

添加>>

这是我用来保存实体的方法:

  create  : function(entity, definition, successFn, errorFn)

    var model = mongoose.model(entity);
    newModel = new model(definition);

    newModel.save(function(error) 
      if(error)
        if(!errorFn)
          throw error;
        
        errorFn(newModel);
        return;
      

      successFn(newModel);
    );
  ...

var Something = new Schema(
  objectId          : ObjectId,
  name              :  type : String, index:  unique: true , 
  url               :  type : String, index:  unique: true ,
...etc
mongoose.model('Something', Something);

Mongo 输出

 [conn1] insert xxxxx.agencies 1526ms
 [conn1] building new index on  name: 1  for xxxxx.agencies
 [conn1] insert xxxxx.system.indexes exception 11000 E11000 duplicate key error    index: xxxxx.agencies.$name_1  dup key:  : "something"  4ms
 [conn1] building new index on  url: 1  for xxxxx.agencies
 [conn1] insert xxxxx.system.indexes exception 11000 E11000 duplicate key error index: xxxxx.agencies.$url_1  dup key:  : "http://www.something.com"  1ms

当我签入 MongoHub 时,索引没有出现,所以它们看起来不像是创建的。

这是this question 的副本,但它没有适合我的答案。

【问题讨论】:

【参考方案1】:

似乎无法创建索引,因为 MongoDB 集合中已经存在重复数据。如果可能,请尝试删除所有数据并从空集合重新开始。

【讨论】:

谢谢 Mike - 我已经试过了。您看到的输出实际上是在一个全新的数据库之后。虽然你的观点实际上可能让我认为我使用 Mongoose 是错误的。 /* Necroposting */ node-mongodb-native的解决方案github.com/christkv/node-mongodb-native/issues/162【参考方案2】:

一种不涉及擦除数据库的解决方案是手动删除任何重复项,然后按照以下方式运行:

db.users.ensureIndex(email:1,unique:true,sparse:true);

来自 mongo 外壳

【讨论】:

【参考方案3】:

由于您想在您的收藏中应用 unique 索引,我建议您删除所有重复的文档。这是执行此操作的代码:

在 Mongo shell 客户端中:

db.agencies.ensureIndex(name: 1, unique: true, dropDups: true);
db.agencies.ensureIndex(url: 1, unique: true, dropDups: true);

【讨论】:

以上是关于唯一索引不适用于 Mongoose / MongoDB的主要内容,如果未能解决你的问题,请参考以下文章

mongoose index

如何在mongo中进行索引后findOneAndUpdate()的性能评估

Mongoose:findOneAndUpdate 不适用于多种条件

save() 不适用于 mongoose.Schema

在参考 Mongoose 中创建唯一索引

Mongoose 模式验证不适用于 Fawn