猿问

为什么 MongoDB 需要 `unique:true` 来创建集合?

我正在使用 Express 和 MongoDB 开发 NodeJS 应用程序。我的对象没有保存到数据库中,所以我深入挖掘,发现如果我使用以下方法,则没有创建目标集合:


const PersonSchema = new Schema({

  firstName: String,

});

如果我使用了该集合,则创建该集合


const PersonSchema = new Schema({

  firstName: { type: String, unique: true},

});

在任何一种情况下,完整的模型server/models/person.js都是:


'use strict';


const mongoose = require('mongoose');

const Schema = mongoose.Schema;


// Use native promises.

mongoose.Promise = global.Promise;


// Define the Person schema.

const PersonSchema = new Schema({

  // ...

});


const Person = mongoose.model('Person', PersonSchema);


module.exports = Person;

我有 MongoDB 4.2.3(db.version()在 mongo shell 中)、npm 6.14.4、mongoose 5.7.5 和 npm mongodb 3.3.2(在 mongo shell 中npm list | grep mongodb)。


为什么MongoDB除了_id创建集合之外还需要一个唯一的字段?


慕哥6287543
浏览 222回答 1
1回答

慕桂英4014372

我刚刚尝试使用几乎相同版本的 mongoose 和 MongoDB 复制您在上面描述的场景,它工作正常,创建(和保存)文档而没有firstName架构中字段的唯一属性。我认为您的对象未保存在数据库中的原因不是因为缺少唯一属性。此外,在没有唯一属性的情况下无法创建集合的原因是 mongoose(或 MongoDB 本身)在您将数据插入集合之前不会创建集合。通过添加唯一属性,MongoDB 将不得不为集合中的该属性创建一个索引文档,从而将数据添加到集合中,这就是为什么看起来只有在添加唯一属性之后才创建集合的原因。因此,虽然db.<collectionName>.find({}) 可能什么都不返回,db.<collectionName>.getIndexes()但会给你一些东西。
随时随地看视频慕课网APP

相关分类

JavaScript
我要回答