lemooljiang avatar

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

lemooljiang

Published: 21 Apr 2023 › Updated: 21 Apr 2023

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

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

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

Written by

Designer , Poet , Technology enthusiasts

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