【发布时间】: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