【问题标题】:Why does MongoDB require `unique:true` to create a collection?为什么 MongoDB 需要 `unique:true` 来创建集合?
【发布时间】:2020-03-31 13:47:53
【问题描述】:

我正在使用 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(在 mongo shell 中带有 db.version())、npm 6.14.4、mongoose 5.7.5 和 npm mongodb 3.3.2(带有 npm list | grep mongodb)。

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

【问题讨论】:

  • 您好!我只是尝试使用几乎相同版本的猫鼬和 MongoDB 来复制它,它工作正常,创建的文档没有架构中 firstName 字段的唯一属性。我不认为您的对象未保存在数据库中的原因是缺少唯一属性。
  • 另外,在没有唯一属性的情况下没有创建集合的原因是猫鼬(或 MongoDB 本身)在您将数据插入集合之前不会创建集合。通过添加唯一属性,MongoDB 将不得不为集合中的该属性创建一个索引文档,从而将数据添加到集合中,这就是为什么看起来只有在添加唯一属性之后才创建集合的原因。所以虽然db.<collectionName>.find({}) 可能什么都不返回,但db.<collectionName>.getIndexes() 会给你一些东西。
  • @Tunmee 确实,这是正确的:没有unique: true,我看不到集合,但db.<collectionName>.getIndexes() 返回一个带有详细信息的对象;在集合中创建文档也会创建集合。你能写一个答案吗?
  • 当然可以。

标签: javascript node.js mongodb mongoose


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-30
    相关资源
    最近更新 更多