Почему MongoDB требует `unique: true` для создания коллекции? - PullRequest
1 голос
/ 31 марта 2020

Я разрабатываю приложение NodeJS с Express и MongoDB. Мои объекты не сохранялись в базе данных, поэтому я копнул глубже и обнаружил, что целевая коллекция не была создана, если я использовал:

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() в оболочке mon go), npm 6.14 .4, mon goose 5.7.5 и npm mongodb 3.3.2 (с npm list | grep mongodb).

Почему MongoDB требует уникального поля в дополнение к _id для создания коллекции?

1 Ответ

1 голос
/ 02 апреля 2020

Я только что попытался воспроизвести сценарий, который вы описали выше, на моем конце с почти такой же версией mon goose и MongoDB, он работал нормально, документы были созданы (и сохранены) без уникального свойства в поле firstName в схема. Я не думаю, что причина, по которой ваши объекты не были сохранены в БД, заключается в отсутствии уникального свойства.

Кроме того, причина, по которой коллекция не была создана без уникального свойства, заключается в том, что mon goose (или сам MongoDB) не будет создавать коллекцию, пока вы не вставите данные в коллекцию. Добавляя уникальное свойство, MongoDB должен будет создать индексный документ для этого свойства в коллекции, следовательно, добавляя данные в коллекцию, и поэтому создается впечатление, что коллекция была создана только после добавления уникального свойства. Таким образом, хотя db.<collectionName>.find({}) может ничего не возвращать, db.<collectionName>.getIndexes() даст вам что-то.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...