【问题标题】:MongoDB: remove unique constraintMongoDB:删除唯一约束
【发布时间】:2012-09-02 11:24:47
【问题描述】:

我正在尝试“使用带有 Express 和 Mongoose 的 Node.js 开发 RESTful API”示例,但遇到了 MongoDB Schema 的问题:

POST: 
{ title: 'My Awesome T-shirt 2',
  description: 'All about the details. Of course it\'s black.',
  style: '12345' }
{ [MongoError: E11000 duplicate key error index: ecomm_database.products.$style_1  dup key: { : "12345" }]
  name: 'MongoError',
  err: 'E11000 duplicate key error index: ecomm_database.products.$style_1  dup key: { : "12345" }',

架构定义中有一个独特的约束:

var Product = new Schema({  
    title: { type: String, required: true },  
    description: { type: String, required: true },  
    style: { type: String, unique: true },  
    modified: { type: Date, default: Date.now } });

我该如何摆脱它?当我删除 unique: true 并重新启动应用程序时,架构不会更新。

mongodb 如何处理模式的“更改”?

【问题讨论】:

    标签: node.js mongodb database-schema


    【解决方案1】:

    “mongodb 如何处理模式的“更改”?”

    MongoDB 无模式

    唯一强制执行的唯一性是在您所在的索引级别上 可以在具有唯一标准的集合上定义索引。所以你可能想删除 相关索引并在必要时重新创建它。

    【讨论】:

    • 那行得通。供参考: > 使用ecomm_database > db.products.dropIndexes(); { "nIndexesWas" : 2, "msg" : "non-_id 索引被删除收集", "ok" : 1 }
    • "MongoDB is schema-less" ... 那么,为什么他们的文档中有一个完整的部分是关于模式设计的呢? mongodb.org/display/DOCS/Schema+Design
    • @ZaidMasud:比“模式设计”内涵更少的过程描述可能是“数据建模”:)。数据必须采取一些名义上的形式(即您仍然需要考虑 schema 设计 来规划您的数据、查询和索引).. 但是没有强制执行严格的 schema文档或集合级别。这与每个表的fixed schema SQL 方法形成鲜明对比,其中每个字段都有特定的类型和大小。
    • @Stennie 是的,该术语有可能被滥用......但我喜欢这样想的方式是 数据以无模式方式存储,即 JSON根据定义,其对应的 BSON 是无模式 blog.mongodb.org/post/119945109/why-schemaless。然而,被视为实体的数据库不是无模式,因为集合为其提供了数据库模式。换句话说,虽然数据以无模式格式表示,但数据库不是。
    • 我生命中的三个小时已经过去,但非常感谢您的发现。 db.users.dropIndexes(); def 为我工作。
    【解决方案2】:

    我希望这会有所帮助。

    db.collection_name.getIndexes()
    

    返回一个数组,该数组包含一个文档列表,用于标识和描述集合中的现有索引。 现在从列表中找到您的索引名称,然后删除该索引,如下所示:

    db.users.dropIndex("your_index_name_here")
    

    这是一个例子:

    db.product.dropIndex({ style: 1 })
    

    【讨论】:

    • 您的第一行需要更正如下。 db.getCollection('units').getIndexes()
    • @kmkm 如果您在 mongo 控制台中使用它,则不会。对我来说就像一个魅力!
    【解决方案3】:

    当您向 mongoose 架构添加唯一约束时,将在同一键上创建索引。例如:如果您有一个名为style 的模式键,那么将创建一个索引为style_1。即使您修改架构,已创建的索引仍将存在。您需要删除此索引才能重置唯一约束。

    如果您安装了 mongoDB Compass,那么您可以转到 collection->indexes 并删除它。 Atlas Web 界面上也提供相同的界面。就我而言,我在键 url 上有一个索引,我已将其删除。

    【讨论】:

      猜你喜欢
      • 2016-11-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-26
      • 2012-10-07
      • 1970-01-01
      • 1970-01-01
      • 2022-01-05
      相关资源
      最近更新 更多