node.js 操作mongodb

连接mongodb

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
const mongoose = require("mongoose");

//连接数据库
mongoose.connect("mongodb://localhost/cats");
//获取连接对象
const db = mongoose.connection;

//监听错误事件
db.on("error", error => {
console.log("connection error", error);
});

//监听成功连接事件
db.once("open", () => {
console.log("connection success");
});

创建Schema

Mongoose的一切始于Schema,每个schema会映射到一个MongoDB的collection 中的 document 表构成

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
/*
mongoose.Schema({key:{type:SchemaType,[options]}})

SchemaTypes
String Number Date Buffer Boolean Mixed ObjectId Array

options:
所有属性可选:
required: 布尔值或函数 如果值为真,为此属性添加 required 验证器
default: 任何值或函数 设置此路径默认值。如果是函数,函数返回值为默认值
select: 布尔值 指定 query 的默认 projections
validate: 函数 adds a validator function for this property
get: 函数 使用 Object.defineProperty() 定义自定义 getter
set: 函数 使用 Object.defineProperty() 定义自定义 setter
alias: 字符串 仅mongoose >= 4.10.0。 为该字段路径定义虚拟值 gets/sets

索引相关:
index: 布尔值 是否对这个属性创建索引
unique: 布尔值 是否对这个属性创建唯一索引
sparse: 布尔值 是否对这个属性创建稀疏索引

String:
lowercase: 布尔值 是否在保存前对此值调用 .toLowerCase()
uppercase: 布尔值 是否在保存前对此值调用 .toUpperCase()
trim: 布尔值 是否在保存前对此值调用 .trim()
match: 正则表达式 创建验证器检查这个值是否匹配给定正则表达式
enum: 数组 创建验证器检查这个值是否包含于给定数组

Number:
min: 数值 创建验证器检查属性是否大于或等于该值
max: 数值 创建验证器检查属性是否小于或等于该值

Date
min: Date
max: Date
使用注意


*/

// 创建文档对象结构 Schema
const kittySchema = mongoose.Schema({name:String})

创建Model

mongodb document是 Model的实例,表示一个表名称,需要使用Schma构建

1
2
// 根据Schema 创建 文档, 指定 文档名称 即表名称
const Kitten = mongoose.model('Kitten',kittySchema);

保存数据

1
2
3
4
5
6
7
8
// 创建对象 即一条记录
const felyne = new Kitten({name:'Felyne'});

//保存对象
felyne.save((error,fluffy)=>{
if(error){console.log('error',error)};
console.log('save success');
})

查找数据

1
2
3
Kitten.find((error,kittens)=>{
console.log(kittens);
});

更新数据

更新数据时,要注意两点

  1. update的属性,必须是Schema中存在的
  2. 使用Model.update 而不是 实例对象的update()方法
    1
    Kitten.update({name:"gavin"},{age:12},callback);

删除数据

1
Kitten.remove({name:"gavin"},callback);

参考文章

https://www.cnblogs.com/tugenhua0707/p/9256605.html