为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕哥6287543 2022-06-09 11:12:43
我正在使用 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创建集合之外还需要一个唯一的字段?
查看完整描述

1 回答

?
慕桂英4014372

TA贡献1871条经验 获得超13个赞

我刚刚尝试使用几乎相同版本的 mongoose 和 MongoDB 复制您在上面描述的场景,它工作正常,创建(和保存)文档而没有firstName架构中字段的唯一属性。我认为您的对象未保存在数据库中的原因不是因为缺少唯一属性。

此外,在没有唯一属性的情况下无法创建集合的原因是 mongoose(或 MongoDB 本身)在您将数据插入集合之前不会创建集合。通过添加唯一属性,MongoDB 将不得不为集合中的该属性创建一个索引文档,从而将数据添加到集合中,这就是为什么看起来只有在添加唯一属性之后才创建集合的原因。因此,虽然db.<collectionName>.find({}) 可能什么都不返回,db.<collectionName>.getIndexes()但会给你一些东西。


查看完整回答
反对 回复 2022-06-09
  • 1 回答
  • 0 关注
  • 221 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号