22

我正在尝试“使用带有 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 如何处理模式的“更改”?

4

3 回答 3

13

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

MongoDB 是无模式的

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

于 2012-09-09T07:53:46.563 回答
7

我希望这会有所帮助。

db.collection_name.getIndexes()

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

db.users.dropIndex("your_index_name_here")

这是一个例子:

db.product.dropIndex({ style: 1 })
于 2020-01-18T09:31:42.083 回答
5

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

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

在此处输入图像描述

于 2020-04-09T10:11:20.290 回答