mongoose

作者: 小小了墨 | 来源:发表于2019-08-13 14:06 被阅读0次

mongoose

结构

  1. 创建一个数据库 集合
  2. Schema: 数据库集合的模型骨架,或者说是表结构
  3. Model: 通过Schema构造的,还可以操作数据库
  4. Entity: 通过Model创建的,也可以操作数据库,不过操作的是当前的实体

基本使用

连接数据库

  1. 安装mongoose
npm install mongoose
  1. 使用
const mongoose = require('mongoose')
// 连接数据库
const db = mongoose.connect('mongodb://user:pass@localhost:port/database')
// 监听
db.connection.on('error', error => {
    console.log('数据库连接失败: ', error)
})

db.connection.on('open', () => {
    console.log('数据库连接成功!')
})

生成一个基本数据

const mongoose = require('mongoose')
// 连接数据库
const db = mongoose.connect('mongodb://user:pass@localhost:port/database')
// 监听
db.connection.on('error', error => {
    console.log('数据库连接失败: ', error)
})

db.connection.on('open', () => {
    console.log('数据库连接成功!')
})
// 定义模型数据结构
const TestSchema = new mongoose.Schema({
    name: { type: String, default: '' },
    age: { type: Number, default: 0 },
    time: { type: Date, default: Date.now() },
    email: { type: String }
})

// 使用Schema创建Model
const TestModel = db.model('test1', TestSchema)

// 使用model创建一个实体
const TestEntity = new TestModel({
    naem: 'zhangSan',
    age: 36,
    email: '123@qq.com'
})
console.log(TestEntity.name) // zhangSan
console.log(TestEntity.tiem) // 创建时默认生成的时间

// 实体存入数据库生成文档
TestEntity.save((error, doc) => {
    if (error) {
       console.log('当前文档存入集合失败', error)
       return false
    }
    // 插入的这条文档
    console.log(doc)
})

简单查询

  1. 第一个参数是查询条件,如果没有则默认查询全部
  2. 第二个参数是查询后返回的结果数组

这里只是简单的,其实应该是四个参数,在后面提到

TestModel.find({}, (error, docs) => {
    // 查询出全部数据
    console.log(docs)
})

TestModel.find({
    age: 36
}, (error, docs) => {
    // 查询出 age 是 36 的数据
    console.log(docs)
})

基本新增数据

  1. model保存

第一个参数是插入的数据,可以是一条对象,也可以是多条对象构成的数组

TestModel.create({
    name: 'liSi',
    age: 20,
    email: 'lisi@qq.com'
}, (error, doc) => {
    // 当前插入的这条
    console.log(doc)
})
  1. Entity保存
const TestEntity = new TestModel({
    name: 'liSi',
    age: 18,
    email: 'lisi@qq.com'
});
TestEntity.save((error, doc) => {
    // 当前插入的这条
    console.log(doc)
})

基本更新数据

  1. 第一个参数:查询条件
  2. 第二个参数:更新对象
  3. 第三个参数:callback
TestModel.update({ age: 18 }, { $set: { age: 16 } }, (error) => {
    if (error) {
        conosle.log('更新失败 >>> ', error)
        return false
    }
    console.log('更新成功')
})

基本删除数据

TestModel.remove({ email: 'lisi@qq.com' }, error => {
    if (error) {
        console.log(error)
        return false
    }
    console.log('删除成功')
})

查询

find

  1. 第一个参数: 查询条件
  2. 第二个参数: 过滤条件
  3. 第三个参数: option(游标), 对要返回的数据处理
  4. 第四个参数: callback

正常只需要把显示的属性设置为大于零就行,默认是零(不显示),除了_id的默认是显示。如果对不需要显示的属性设置零会报错或者无结果,除非是_id

TestModel.find({}, { name: 1, age: 1, _id:0 }, (error, docs) => {
    // 查询全部,返回显示一个键值name、age的值,其他不显示
    console.log(docs)
})

findOne

使用和 find 一样,只是返回单个结果(也就是第一个查询到的,并停止查询)

findById

使用和 findOne 一样,返回单个结果,但是只接受文档的_id作为参数

TestModel.findById('obj._id', function (err, doc){
 // 查询的单个文档
 console.log(doc)
}); 

条件查询

条件 含义
$lt 小于
$lte 小于等于
$gt 大于
$gte 大于等于
$ne 不等于
$in 可单值和多个值匹配
$or 查询多个键值的任意给定值
$exists 表示是否存在
$all 所有
TestModel.find({ age: { $gt: 18 }}, (error, docs) => {
    // > 18
    console.log(docs)
})

TestModel.find({ age: { $gte: 18, $lt: 60 }}, (error, docs) => {
    // 18 <= x < 60
    console.log(docs)
})

TestModel.find({ name: 'test', age: {$in: [20, 30]}}, (error, docs) => {
    // name: test 且 age 包含 20或者30
    console.log(docs)
})

TestModel.find({
    $or: [
        { name: 'test'},
        { age: { $gte: 18 } }
    ]
}, (error, docs) => {
    // name: test 或者 age >= 18
    console.log(docs)
})

TestModel.find({ name: { $exists: true }}, (error, docs) => {
    // name存在的
    console.log(docs)
})

TestModel.find({ name: { $exists: false }}, (error, docs) => {
    // name不存在的
    console.log(docs)
})

游标

对查询返回的结果进行控制

limit

TestModel.find({}, null, { limit: 10 }, (err, docs) => {
    // 最多返回10个
})

skip

TestModel.find({}, null, { skip: 10 }, (err, docs) => {
    // 返回从11-20的
})

sort

1是升序,-1是降序

TestModel.find({}, null, { sort: { age: -1 } }, (err, docs) => {
    // 按 age 倒序返回
})

mongoose属性或者方法

ObjectId

一个12字节的BSON类型字符串

  • 4字节: UNIX时间戳
  • 3字节: 表示运行MongoDB的机器
  • 2字节: 表示生成此_id的进程
  • 3字节: 由一个随机数开始的计数器生成的值

为Schema添加属性值

当最初定义的Schema不满足时

const mongoose = requrie('mongoose')
const Schema = new mongoose.Schema
Schema.add({
    name: String,
    email: String,
    age: Number
})

在Schema创建实例方法

有的时候,我们创造的Schema不仅要为后面的Model和Entity提供公共的属性,还要提供公共的方法.

const mongoose = require('mongoose')
const saySchema = new mongoose.Schema({name: String})
saySchema.method('say', () => {
    console.log('say method')
})
const sayModel = mongoose.model('say', saySchema)
const say = new sayModel()
say.say() // say method

为Schema创建静态方法

const mongoose = require('mongoose')
const db = mongoose.connect("mongodb://127.0.0.1:27017/test")
const TestSchema = new mongoose.Schema({
    name : { type:String },
    age  : { type:Number, default:0 },
    email: { type:String, default:"" },
    time : { type:Date, default:Date.now() }
})
TestSchema.static('findByName', function (name, callback) {
    return this.find({name}, callback)
})
const TestModel = db.model('test1', TestSchema)
TestModel.findByName('test', (err, docs) => {
    // name 为 test的 
    console.log(docs)
})

为Schema追加方法

const mongoose = require("mongoose")
const db = mongoose.connect("mongodb://127.0.0.1:27017/test")
const TestSchema = new mongoose.Schema({
    name : { type:String },
    age  : { type:Number, default:0 },
    email: { type:String, default:"" },
    time : { type:Date, default:Date.now }
})
 
TestSchema.methods.speak = function(){
  console.log('我的名字叫'+this.name)
}
 
const TestModel = db.model('test1',TestSchema)
const TestEntity = new TestModel({name:'Lenka'})
TestEntity.speak() // 我的名字叫Lenka

连接

connect

const mongoose = require('mongoose')
mongoose.connect(mongodb://localhost/test)
const db = mongoose.connection
db.once('open', () => {
    // code
})
const schema = mongoose.Schema({
    name: String
})
const model = mongoose.model('test', schema)
const zhangSan = new model({ name: 'zhangSan' })
zhangSan.save(err => {
    // code
})

createConnection

const mongoose = require('mongoose')

const db = mongoose.createConnection('localhost', 'test')

const schema = new mongoose.Schema({
    name: String
})
const collectionName = 'user'
const model = db.model('test', schema, collectionName)
const zhangSan = new model({ name: 'zhangSan' })
zhangSan.save(err => {
    // code
})

区别

  1. 如果只使用一个数据库,推荐使用 mongoose.connect();如果需要创建额外的连接,需要使用 mongoose.createConection()
  2. 连接后,使用mongoose.connect()的连接就是mongoose.connection;使用mongoose.createConnection()的连接就是它的返回值

查询出的结果去重(distinct)

TestModel.distinct(field, conditions, callback)
TestModel.distinct(field, conditions)
TestModel.distinct(field, callback)
TestModel.distinct(field)
  • field:去重的依据的字段及返回的字段
  • conditions:查询的条件
  • callback:查询结果的回调,如果后面跟exec()的话,则是then

后面不能跟sortskip之类的方法。折中的方案,可以将结果使用find方法再做一次查询

相关文章

网友评论

      本文标题:mongoose

      本文链接:https://www.haomeiwen.com/subject/kngvjctx.html