所以我有一个使用MongoDB作为数据库的应用程序。该应用程序使用了一些集合。
何时以及如何定义数据库的“模式”,包括设置所有集合以及所需的索引?
AFAIK,你无法在MongoDB中定义空集合(如果我错了,请纠正我,如果我能做到这一点,它基本上会回答这个问题)。我应该为每个集合插入一个虚拟值并使用它来设置我的所有索引吗?
最佳做法是什么?
答案 0 :(得分:10)
您不在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"
}
]
答案 1 :(得分:6)
首先,这是如何使用内置交互式终端在MongoDB中创建空集合,这样就可以了,
db.createCollection('someName'); // create empty collection
只是你没有必要,因为有人说过,一旦你开始与数据库交互,他们将实时创建。
您可以创建自己的类,与mongo数据库进行交互。在该类中,您可以定义必须满足的规则,然后才能将数据插入到mongo集合中,而不是其他明智的自定义异常。
或者如果您使用node.js服务器端,您可以安装 mongoose 节点包,它允许您以OOP样式与数据库进行交互(为什么还要重新发明轮子,对吧?)。
Mongoose为模型提供了一种直接的,基于模式的解决方案 你的申请数据。它包括内置式铸造,验证, 查询构建,业务逻辑钩子等等,开箱即用。
docs: mongoose npm安装和基本用法 https://www.npmjs.com/package/mongoose mongoose完整文档http://mongoosejs.com
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);
});
能够在我们的代码中设置模式以及限制并不会改变MongoDB本身无模式的事实,这在某些情况下是现实的优势。这样,如果您决定对架构进行更改,但是您不需要考虑向后兼容性,只需在脚本中编辑架构即可完成。这是mongodb背后的基本思想,能够在同一集合中存储每个文档中的不同数据集。但是,总是希望在代码库逻辑中有一些限制。
答案 2 :(得分:2)
const mongoose = require("mongoose");
const RegisterSchema = mongoose.Schema({
username: {
type: String,
unique: true,
requied: true,
},
email: {
type: String,
unique: true,
requied: true,
},
password: {
type: String,
requied: true,
},
date: {
type: Date,
default: Date.now,
},
});
exports.module = Register = mongoose.model("Register", RegisterSchema);
我看了this tutorial。
答案 3 :(得分:1)
你已经被告知MongoDB是无模式的。但是,在实践中,我们有一种“模式”,即对象的对象空间,它与MongoDB数据库所代表的关系。由于Ruby是我的首选语言,并且我没有声称这个答案的详尽性,我建议尝试两个软件:
1. ActiveRecord (part of Rails)
2. Mongoid (standalone MongoDB "schema", or rather, object persistence system in Ruby)
但是,期待学习曲线。我希望其他人能够指出您使用其他优秀语言的解决方案,例如Python。
答案 4 :(得分:1)
从版本3.2开始,mongodb现在在集合级别提供架构验证:
答案 5 :(得分:0)
1.Install mongoose:
npm install mongoose
2. Set-up connection string and call-backs
// getting-started.js
var mongoose = require('mongoose');
mongoose.connect('mongodb://localhost/test');
//call-backs
var db = mongoose.connection;
db.on('error', console.error.bind(console, 'connection error:'));
db.once('open', function() {
// we're connected!
});
3. Write your schema
var kittySchema = new mongoose.Schema({
name: String
});
4. Model the schema
var Kitten = mongoose.model('Kitten', kittySchema);
5. Create a document
var silence = new Kitten({ name: 'Tom' });
console.log(silence.name); // Prints 'Tom' to console
// NOTE: methods must be added to the schema before compiling it with mongoose.model()
kittySchema.methods.speak = function () {
var greeting = this.name
? "Meow name is " + this.name
: "I don't have a name";
console.log(greeting);
}
enter code here
var Kitten = mongoose.model('Kitten', kittySchema);
Functions added to the methods property of a schema get compiled into the Model prototype and exposed on each document instance:
var fluffy = new Kitten({ name: 'fluffy' });
fluffy.speak(); // "Meow name is fluffy"
答案 6 :(得分:0)
创建架构的示例:
db.createCollection("students", {
validator: {
$jsonSchema: {
bsonType: "object",
required: [ "name", "year", "major", "address" ],
properties: {
name: {
bsonType: "string",
description: "must be a string and is required"
},
year: {
bsonType: "int",
minimum: 2017,
maximum: 3017,
description: "must be an integer in [ 2017, 3017 ] and is required"
},
major: {
enum: [ "Math", "English", "Computer Science", "History", null ],
description: "can only be one of the enum values and is required"
},
gpa: {
bsonType: [ "double" ],
description: "must be a double if the field exists"
},
address: {
bsonType: "object",
required: [ "city" ],
properties: {
street: {
bsonType: "string",
description: "must be a string if the field exists"
},
city: {
bsonType: "string",
description: "must be a string and is required"
}
}
}
}
}
}
})