Published: 21 Apr 2023 › Updated: 21 Apr 2023
MongoDB的数据结构和字段 / 网络研习社#82
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几乎是最佳选择!
Leave MongoDB的数据结构和字段 / 网络研习社#82 to:
Read more #cn posts
Best Posts From lemooljiang
We have not curated any of lemooljiang's posts yet. But you can encourage our curation team to review posts by visiting them regularly and by referring other readers. Because we give priority to frequently read content.
More Posts From lemooljiang
- Nextjs初体验,和Nuxt的异同
- DeepTutor:AI个性化辅导平台 / ai #57
- ComfyUI:可编程和自动化的PS / ai #56
- 将Neo4j封装进Agent / ai #55
- 闲鱼省钱大法:极限0.5折!
- 对Neo4j批量导入结构化数据 / ai #54
- langchain对neo4j进行交互,写入和查询数据 / ai #53
- 知识图谱和图数据库Neo4j的作用和使用场景 / ai #52
- SpaceX、美股和比特币
- 又是币圈血洗日!
- 链股合流,当币安也开始卖股票啰
- 天涯社区重启,爷青回?
- 诺基亚在AI时代重新杀回来啦
- 《2049:未来10000天的可能》书中的镜像世界为什么不叫元宇宙
- 今天适合吃披萨
- 开通即被封,别再给Claude送人头了!
- 两根内存条引发的“官司”
- AI·Joe V12更新, 更新GPT-5.5和DeepSeek V4 等
- 中医进校园活动反响热烈
- 猪价低伤农,猪价贵伤民