MongoDB非常灵活,不需要像MySQL一样创建数据库、表、设计表结构。它只需要向指定的数据库集合插入即可(数据库不存在也没关系,可以随时自动创建)。
MongoDB可以有多个数据库,一个数据库可以有多个集合(表),一个集合可以有多个文档(表记录)。可以有相同的表结构,也可以不同。
MongoDB的数据结构类似上图中的JSON样式
常用字段类型
String Number Date Buffer Boolean Mixed ObjectId Array Decimal128 Map UUID
//其它:
其它属性:
index: 布尔值 是否对这个属性创建索引
unique: 布尔值 是否对这个属性创建唯一索引
sparse: 布尔值 是否对这个属性创建稀疏索引
required: 布尔值或函数 如果值为真,为此属性添加 required 验证器
default: 任何值或函数 设置此路径默认值。如果是函数,函数返回值为默认值
get: 函数 使用 Object.defineProperty() 定义自定义 getter
set: 函数 使用 Object.defineProperty() 定义自定义 setter
Mixed: 等同于:{} Object Schema.Types.Mixed, 可以存入任何对象
eg:
const schema = new Schema({
name: String,
binary: Buffer,
living: Boolean,
updated: { type: Date, default: Date.now },
age: { type: Number, min: 18, max: 65 },
mixed: Schema.Types.Mixed,
_someId: Schema.Types.ObjectId, //mongoose.ObjectId
decimal: Schema.Types.Decimal128,
array: [],
ofString: [String],
ofNumber: [Number],
ofDates: [Date],
ofBuffer: [Buffer],
ofBoolean: [Boolean],
ofMixed: [Schema.Types.Mixed],
ofObjectId: [Schema.Types.ObjectId],
ofArrays: [[]],
ofArrayOfNumbers: [[Number]],
nested: {
stuff: { type: String, lowercase: true, trim: true }
},
map: Map,
mapOfString: {
type: Map,
of: String
},
uuid: Schema.Types.UUID, // Can also do `_id: 'UUID'`
})
const Thing = mongoose.model('Thing', schema)
const m = new Thing
m.name = 'Statue of Liberty'
m.age = 125
m.updated = new Date
//m.markModified('updated')
m.binary = Buffer.alloc(0)
m.living = false
m.mixed = { any: { thing: 'i want' } }
m.markModified('mixed')
m._someId = new mongoose.Types.ObjectId
m.array.push(1)
m.ofString.push('strings!')
m.ofNumber.unshift(1, 2, 3, 4)
m.ofDates.addToSet(new Date)
m.ofBuffer.pop()
m.ofMixed = [1, [], 'three', { four: 5 }]
m.nested.stuff = 'good'
m.map = new Map([['key', 'value']])
m.uuid = require('crypto').randomUUID()
m.save(callback)
Schemas
import mongoose from 'mongoose'
mongoose.connect('mongodb://localhost/test')
const { Schema } = mongoose
const kittySchema = new Schema({
name: String
})
//在这之后你还想添加 keys 的话, 请使用 Schema#add 方法
// 当然,也可以直接在原Schema上添加字段,只是以前的数据就没有这些字段,可以通过更新方法添加
//Schema.prototype.add()
kittySchema.add({
color: String,
price: Number
})
// method 是给 document 用的
// 要在mongoose.model之前添加方法
// 加在 schema methods 属性的函数会编译到 Model 的 prototype, 也会暴露到每个 document 实例
kittySchema.methods.speak = function () {
let greeting = this.name
? "Meow name is " + this.name
: "I don't have a name"
console.log(greeting)
}
//model 是我们构造 document 的 Class,它同样会有变量和方法。
const Kitten = mongoose.model('Kitten', kittySchema)
//新增数据
const huahua = new Kitten({
name: "huahua"
})
huahua.save()
.then((res) => console.log('新增成功', res))
.catch(error => console.log(44, error))
//查找
let kitty = await Kitten.findOne()
kitty.speak()
从上可以看出,MongoDB的数据和交互和现在流行的JSON格式几乎一致,而且它对格式的要求也比较宽,有些出入也不会报错。数据可以很灵活地变动和拓展,非常适合现有的网格需求。如果你现在想创建一个中小型的网络项目,那么,MongoDB几乎是最佳选择!