所以我有一个使用 MongoDB 作为数据库的应用程序。该应用程序使用了一些集合。
我应该何时以及如何定义数据库的“模式”,包括设置所有集合以及所需的索引?
AFAIK,您无法在 MongoDB 中定义空集合(如果我错了,请纠正我,如果我能做到这一点,它基本上会回答这个问题)。我应该为每个集合插入一个虚拟值并使用它来设置我的所有索引吗?
对此的最佳做法是什么?
所以我有一个使用 MongoDB 作为数据库的应用程序。该应用程序使用了一些集合。
我应该何时以及如何定义数据库的“模式”,包括设置所有集合以及所需的索引?
AFAIK,您无法在 MongoDB 中定义空集合(如果我错了,请纠正我,如果我能做到这一点,它基本上会回答这个问题)。我应该为每个集合插入一个虚拟值并使用它来设置我的所有索引吗?
对此的最佳做法是什么?
您不会在 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"
}
]
db.createCollection('someName'); // create empty collection
只是您实际上不必这样做,因为正如之前有人指出的那样,一旦您开始与数据库交互,它们就会实时创建。
或者,如果您使用 node.js 服务器端,您可以安装mongoose节点包,它允许您以 OOP 风格与数据库进行交互(为什么要重新发明轮子,对吧?)。
Mongoose 提供了一个直接的、基于模式的解决方案来为您的应用程序数据建模。它包括内置的类型转换、验证、查询构建、业务逻辑挂钩等,开箱即用。
文档: 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);
});
从 3.2 版开始,mongodb 现在在集合级别提供模式验证:
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);
我看了这个教程。
您已经被告知 MongoDB 是无模式的。但是,在实践中,我们有一种“模式”,那就是对象的对象空间,MongoDB 数据库表示其关系。鉴于 Ruby 是我的首选语言,并且我没有声称这个答案的详尽无遗,我建议尝试两种软件:
1. ActiveRecord (part of Rails)
2. Mongoid (standalone MongoDB "schema", or rather, object persistence system in Ruby)
不过,期待学习曲线。我希望其他人会向您指出我的专业之外的其他优秀语言的解决方案,例如 Python。
创建模式的示例:
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"
}
}
}
}
}
}
})
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"