mongoose是操作mongodb的一个数据模型库;封装了mongodb对文档操作的常用处理方法(增删改查),让nodejs操作mongodb数据库变得快捷灵活。
安装mongoose
在昨天的mongo目录下安装mongoose1
npm install mongoose
连接数据库
新建mongoose.js,并编辑1
2
3
4
5
6
7
8var mongoose = require('mongoose');
var db = mongoose.connect('mongodb://localhost/test');
db.connection.on('error', function(error) {
console.log('数据库test连接失败:' + error);
});
db.connection.on('open', function() {
console.log('数据库test连接成功');
});
打开一个终端,开启mongodb服务:1
mongod
再打开一个终端,运行mongoose.js:1
2node mongoose.js
<!--成功后便会输出:数据库test连接成功-->
Schema/Model
1.Schema: 数据库集合的结构对象(一个Schema对应一个collection),定义document文档结构
2.Model: 由Schema构建而成,可操作数据库
继续编辑mongoose.js,在数据库连接成功的情况下,在数据库test中新建一个集合test11
2
3
4
5
6
7
8
9var TestSchema = new mongoose.Schema({
name: {type: String},
age: {type: Number, default: 0},
email: {type: String},
time: {type: Date, default: Date.now}
});
var TestModel = db.model('test1', TestSchema);
<!--集合名称,集合的结构对象-->
<!--Document文档(关联数组式的对象)< Collection对象 < 数据库-->
Model数据插入
插入保存一组数据1
2
3
4
5
6
7
8
9
10
11
12TestModel.create([
{name: 'mogu', age: 8},
{name: 'lly', age: 9},
{name: 'nobody', age: 38, email: '123@qq.com'}
], function(error, docs) {
if(error) {
console.log('error: ' + error);
} else {
console.log('save ok');
console.log(docs);
}
});
find 数据查询
mongoose提供了find、findOne和findById方法用于文档查询。
基本语法:1
model.find(Conditions, fields, options, callback(err, doc));
Conditions:查询条件
fields:返回的字段
options:游标
callback:回调函数,参数doc为查询出来的结果
条件查询的基础:$lt(小于 <)$lte(小于等于 <=)$gt(大于 >)$gte(大于等于 >=)$ne(不等于,不包含 !=)$in(包含)$or(查询多个键值的任意给定值)$exists(判断某些属性是否存在)all(全部)
可用👇的代码进行实践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
43
44
45
46
47
48
49
50// find(Conditions, fields, callback);
// 省略或为空、返回所有记录;只包含name,age字段,去掉默认的_id字段;执行回调函数
TestModel.find({}, {name: 1, age: 1}, function(error, docs) {
if(error) {
console.log('查询出错:' + error);
} else {
console.log('{}查询结果为:');
console.log(docs);
}
});
// 查询age 大于9岁,小于30岁
TestModel.find({age: {$gte: 9, $lte: 30}}, {name: 1, age: 1}, function(error, docs) {
if(error) {
console.log('查询出错:' + error);
} else {
console.log('$gte查询结果为:');
console.log(docs);
}
});
// 查询age为8和28的数据
TestModel.find({age: {$in: [8, 28]}}, {name: 1, age: 1}, function(error, docs) {
if(error) {
console.log('查询出错:' + error);
} else {
console.log('$in查询结果为:');
console.log(docs);
}
});
// 查询name为lly、或者age为8的所有数据
TestModel.find({$or: [{name: 'lly'}, {age: 8}]}, {name: 1, age: 1, _id: 0}, function(error, docs) {
if(error) {
console.log('查询出错:' + error);
} else {
console.log('$or查询结果为:');
console.log(docs);
}
});
// 查询name为lly、或者age为8的全部数据,但限制只查询2条数据
TestModel.find({$or: [{name: 'lly'}, {age: 8}]}, {name: 1, age: 1, _id: 0}, {limit: 2}, function(error, docs) {
if(error) {
console.log('查询出错:' + error);
} else {
console.log('limit查询结果为:');
console.log(docs);
}
});
代码中有一段{name: 1, age: 1, _id: 0}表示只包含name,age字段,去掉默认的_id字段,在实践过程中错误的将_id字段修改为email字段后,出现了如下报错:
大意为不能混合包含和排除
经检查除_id字段以外,不能同时混合包含和排出其他字段。如果需要的是name和age字段,可以如下表示1
{name: 1, age: 1, _id: 0}
或1
{email: 0, _id: 0}
不允许混合除_id之外的任何其他字段。
update数据更新
1 | model.update(查询条件,更新对象,callback); |
示例代码如下1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19// update 数据更新
// model.update(查询条件,更新对象,callback)
var conditions = {name: 'helloworld'};
var update = {$set: {age: 11}};
TestModel.update(conditions, update, function(error) {
if(error) {
console.log('error:' + error);
} else {
console.log('update successfully!');
TestModel.find({name: 'helloworld'}, {name: 1, age: 1, _id: 0}, function(err, docs) {
if(err) {
console.log('查询出错:' + err);
} else {
console.log('更新helloworld后的查询结果为:');
console.log(docs);
}
});
}
});
只能更新本来已存在的数据,更新不存在的数据,不会生成新的数据。
remove数据删除
1 | model.remove(查询条件,callback); |
示例代码如下: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// remove 删除数据
// model.remove(查询条件,callback);
var conditions = {
$or: [{
name: 'mogu'
}, {
name: 'lly'
}, {
name: 'nobody'
}]
};
TestModel.remove(conditions, function (error) {
if (error) {
console.log(error);
} else {
console.log('Delete Successfully!');
TestModel.find({
$or: [{
name: 'lly'
}, {
name: 'mogu'
}, {
name: 'nobody'
}]
}, {
name: 1,
age: 1,
_id: 0
}, function (err, docs) {
if (err) {
console.log(err);
} else {
console.log('删除mogu、lly和nobody后的查询结果为:');
console.log(docs);
}
})
}
})
<!--删除后的查询结果为空数组-->