Node.js Mongoose 核心概念与 Schema 详解
本文深入解析 Node.js 中 Mongoose 库的核心机制,重点讲解 Schema 的定义与类型、Model 的创建、实例方法与静态方法的添加、索引配置以及虚拟化字段的实现。通过具体代码示例,展示如何高效操作 MongoDB 数据模型,帮助开发者掌握 Mongoose 的关键特性。
前言与概述
前言
Mongoose 是在 node.js 环境下,对 mongodb 进行便捷操作的对象模型工具。本文介绍解(翻)密(译)Mongoose 插件。
Schema 基础与类型定义
Schema
开始我们就要讲到 Schema,一个 Schema 对应的是 mongodb 的 collection(相当于 SQL table),并且定义其结构。
var mongoose = require('mongoose');
var Schema = mongoose.Schema;
//定义一个博客结构
var blogSchema = new Schema({
title: String,
author: String,
body: String,
comments: [{ body: String, date: Date }],
date: { type: Date, default: Date.now },
hidden: Boolean,
meta: {
votes: Number,
favs: Number
}
});
Schema 可用 Type:
.String (ex: 'ABCD')
.Number (ex: 123)
.Date (ex: new Date)
.Buffer (ex: new Buffer(0))
.Boolean (ex: false)
.Schema.Types.Mixed (ex: {any:{thing:'ok'}})
.Schema.Types.ObjectId (ex:new mongoose.Types.ObjectID)
.Array (ex:[1,2,3])
.Schema.Types.Decimal128
.Map (ex: new Map([['key','value']]))
我们可以通过一段代码,将 Schema 转化成 Model: mongoose.model(modelName,Schema)
Schema 转换为 Model
var Blog = mongoose.model('Blog', blogSchema);
赋予 Schema 方法,当方法转成 Model 的时候,会将方法给予 Model
Schema 实例方法与静态方法
//创建一个变量,Schema
var animalSchema = new Schema({ name: String, type: String });
//将方法赋予这个Schema
animalSchema.methods.findSimilarTypes = function(cb) {
return this.model('Animal').find({ type: this.type }, cb);
};
var Animal = mongoose.model('Animal', animalSchema);
var dog = new Animal({ type: 'dog' });
dog.findSimilarTypes(function(err, dogs) {
console.log(dogs); // woof
});
在 Schema 方法里,不要使用箭头函数,它会重新绑定 this。
赋予 Schema static (静态)方法,我们继续使用上面的例子:
//赋予静态方法,可以再Model不实例化的情况下调用
animalSchema.statics.findByName = function(name, cb) {
return this.find({ name: new RegExp(name, 'i') }, cb);
};
var Animal = mongoose.model('Animal', animalSchema);
Animal.findByName('fido', function(err, animals) {
console.log(animals);
});
Schema 索引 index
MongoDB 支持二级索引,在 mongoose,我们可以将索引定在 Schema 层。
Schema 索引配置
var animalSchema = new Schema({
name: String,
type: String,
tags: { type: [String], index: true } // 声明在字段层
});
animalSchema.index({ name: 1, type: -1 }); // 声明在
使用 index(二级索引)的时候记得要 disable Mongodb 的 autoIndex。
mongoose.connect('mongodb://user:pass@localhost:port/database', { autoIndex: false });
// 或者
mongoose.createConnection('mongodb://user:pass@localhost:port/database', { autoIndex: false });
// 或者
animalSchema.set('autoIndex', false);
// 或者
new Schema({..}, { autoIndex: false });
虚拟化
虚拟化与别名机制
// 声明一个Schema
var personSchema = new Schema({
name: {
first: String,
last: String
}
});
// 转成Model
var Person = mongoose.model('Person', personSchema);
// 实例化Model
var axl = new Person({
name: { first: 'Axl', last: 'Rose' }
});
//1.如果我们想要打印Person的姓名
console.log(axl.name.first + ' ' + axl.name.last); // Axl Rose
//2.使用虚拟化,我们声明一个虚拟字段,然后通过get给其赋值
personSchema.virtual('fullName').get(function () {
return this.name.first + ' ' + this.name.last;
});
console.log(axl.fullName); // Axl Rose
别名
var personSchema = new Schema({
n: {
type: String,
// 给予 n 别名 name,n与name指向同一个值
alias: 'name'
}
});
// 修改name同样修改n,方向一样
var person = new Person({ name: 'Val' });
console.log(person); // { n: 'Val' }
console.log(person.toObject({ virtuals: true })); // { n: 'Val', name: 'Val' }
console.log(person.name); // "Val"
person.name = 'Not Val';
console.log(person); // { n: 'Not Val' }
Model & Documents
Model 与 Documents 操作
增
var Tank = mongoose.model('Tank', yourSchema);
var small = new Tank({ size: 'small' });
//使用save的方法
small.save(function (err) {
if (err) return handleError(err);
// saved!
});
// 或者 使用create
Tank.create({ size: 'small' }, function (err, small) {
if (err) return handleError(err);
// saved!
});
// 或者 使用insertMany/insertOne
Tank.insertMany([{ size: 'small' }], function(err) {
});
删
//deleteOne 或者 deleteMany
Tank.deleteOne({ size: 'large' }, function (err) {
if (err) return handleError(err);
// 只删掉符合项的第一条
});
改
Tank.updateOne({ size: 'large' }, { name: 'T-90' }, function(err, res) {
});
// findOneAndUpdate 查找出相应的数据,修改,并返还给程序
查
// 查提供了多种方式,find,findById,findOne,和where
Tank.find({ size: 'small' }).where('createdDate').gt(oneYearAgo).exec(callback);
总结
总结
以上所述是小编给大家介绍的 Nodejs mongoose 的相关知识,希望对大家有所帮助,如果大家有任何疑问欢迎给我留言,小编会及时回复大家的!
怎么在本地运行JavaScript脚本:Node.js下载安装与环境配置教程
2026-11-05 09:02:33
JavaScript开发环境怎么搭建:Node.js安装与VS Code配置指南
2026-11-03 23:36:59
JavaScript零基础入门:环境搭建与第一个Hello World
2026-11-03 23:34:09
NW.js 是什么:基于 Chromium 和 Node.js 的桌面应用框架
2026-11-03 15:14:00
nvm、n 和官方安装包:哪种 Node.js 升级方式更适合你
2026-11-03 14:54:28
