MongoDB:如何定义架构?

Ayr*_*yrx 18 mongodb

所以我有一个使用MongoDB作为数据库的应用程序.该应用程序使用了一些集合.

何时以及如何定义数据库的"模式",包括设置所有集合以及所需的索引?

AFAIK,你无法在MongoDB中定义空集合(如果我错了,请纠正我,如果我能做到这一点,它基本上会回答这个问题).我应该为每个集合插入一个虚拟值并使用它来设置我的所有索引吗?

这是什么最好的做法?

kir*_*gin 11

您不在MongoDB中创建集合.
您只需立即开始使用它们是否"存在".

现在来定义"架构".正如我所说,你刚开始使用一个集合,所以,如果你需要确保一个索引,那就继续这样做吧.没有集合创建.首次修改时会有效地创建任何集合(创建索引计数).

> db.no_such_collection.getIndices()
[ ]
> db.no_such_collection.ensureIndex({whatever: 1})
> db.no_such_collection.getIndices()
[
        {
                "v" : 1,
                "key" : {
                        "_id" : 1
                },
                "ns" : "test.no_such_collection",
                "name" : "_id_"
        },
        {
                "v" : 1,
                "key" : {
                        "whatever" : 1
                },
                "ns" : "test.no_such_collection",
                "name" : "whatever_1"
        }
]
Run Code Online (Sandbox Code Playgroud)

  • @TerryChia是的,在注意到这已经在评论中被混淆后,我打算删除我的答案,但由于该作者不想发布答案,所以我决定将其留在这里,仅供未来不这样做的读者使用阅读评论。 (2认同)

Dev*_*vWL 9

创建空集合

首先,这是如何使用内置交互式终端在MongoDB中创建空集合,所以你可以这样做,

db.createCollection('someName'); // create empty collection
Run Code Online (Sandbox Code Playgroud)

只是你没有必要,因为有人说,一旦你开始与数据库交互,他们将实时创建.

MongoDB是无架构的故事结尾但......

您可以创建自己的类,与mongo数据库交互.在该类中,您可以定义必须满足的规则,然后才能将数据插入到mongo集合中.

或者如果您使用node.js服务器端,您可以安装mongoose节点包,它允许您以OOP样式与数据库交互(为什么还要重新发明轮子,对吧?).

Mongoose提供了一种直接的,基于模式的解决方案来为您的应用程序数据建模.它包括内置的类型转换,验证,查询构建,业务逻辑钩子等,开箱即用.

docs: mongoose npm安装和基本用法 https://www.npmjs.com/package/mongoose mongoose完整文档http://mongoosejs.com

Mongoose使用示例(定义模式和插入数据)

var personSchema = new Schema({
    name: { type: String, default: 'anonymous' },
    age: { type: Number, min: 18, index: true },
    bio: { type: String, match: /[a-zA-Z ]/ },
    date: { type: Date, default: Date.now },
});

var personModel = mongoose.model('Person', personSchema);
var comment1 = new personModel({
    name: 'Witkor',
    age: '29',
    bio: 'Description',
});

comment1.save(function (err, comment) {
    if (err) console.log(err);
    else console.log('fallowing comment was saved:', comment);
});
Run Code Online (Sandbox Code Playgroud)

Bla bla bla ...

能够在我们的代码中设置模式和限制并不会改变MongoDB本身无模式的事实,这在某些情况下是现实的优势.这样,如果你决定对模式进行更改,但是你不需要考虑向后兼容性,只需在脚本中编辑模式就可以了.这是mongodb背后的基本思想,能够在同一集合中存储每个文档中的不同数据集.但是,总是希望在代码库逻辑中有一些限制.


Jon*_*FTW 6

从版本 3.2 开始,mongodb 现在提供集合级别的模式验证:

https://docs.mongodb.com/manual/core/schema-validation/