MongoDB的数据结构和字段 / 网络研习社#82

in STEEM CN/中文last year

MongoDB非常灵活,不需要像MySQL一样创建数据库、表、设计表结构。它只需要向指定的数据库集合插入即可(数据库不存在也没关系,可以随时自动创建)。

MongoDB可以有多个数据库,一个数据库可以有多个集合(表),一个集合可以有多个文档(表记录)。可以有相同的表结构,也可以不同。

mongodb.jpg

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几乎是最佳选择!

Coin Marketplace

STEEM 0.19
TRX 0.14
JST 0.030
BTC 64647.65
ETH 3473.91
USDT 1.00
SBD 2.50