快速上手

手册

基本概念

MongoDB 概念 对应 RDBMS 概念
database database
collection table
document row
field column

MongoDB 是由 C++ 编写的一个基于分布式文件存储的开源数据库系统。

MongoDB 将数据存储为一个文档,由 K - V 对组成。MongoDB 文档类似于 JSON 对象。字段值可以包含其他文档,数组及文档数组。

基本操作

  • “show dbs”“show databases” 显示所有的数据库。
1
2
3
4
5
6
7
8
9
10
11
>show databases
<admin 40.00 KiB
config 36.00 KiB
local 72.00 KiB
test 72.00 KiB

>show dbs
<admin 40.00 KiB
config 36.00 KiB
local 72.00 KiB
test 72.00 KiB
  • “use dbname” 如果数据库不存在,则创建数据库,否则连接到指定数据库。

    “db.dropDatabase()” 删除当前数据库。

1
2
>use test
<'switched to db test'
  • “db.clname.insert()” 插入一条或多条 document。

    “db.clname.insertOne()” 插入一条 document。

    “db.clname.insertMany()” 插入多条 document。

    插入 document 时,会自动创建 collection。若插入的数据无 _id 字段,会自动生成。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    >db.students.insert([
    { name : "zhangsan", age : 18 },
    { name : "lisi", age : 19 }
    ])
    >db.students.insertOne({ name : "wangwu", age : 18})
    >db.students.find()
    <{ _id: ObjectId("633aa225f3b1a9afbafe6fc9"),
    name: 'zhangsan',
    age: 18 }
    { _id: ObjectId("633aa225f3b1a9afbafe6fca"),
    name: 'lisi',
    age: 19 }
  • “db.clname.find()” 查询符合条件的 document。

    “db.clname.findOne()” 查询符合条件的 document 的第一个。

    “db.clname.find().count()” 计数。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
>db.students.find({age : 18})
<{ _id: ObjectId("633aa225f3b1a9afbafe6fc9"),
name: 'zhangsan',
age: 18 }
{ _id: ObjectId("633aa529f3b1a9afbafe6fcb"),
name: 'wangwu',
age: 18 }

>db.students.findOne({age : 18})
<{ _id: ObjectId("633aa225f3b1a9afbafe6fc9"),
name: 'zhangsan',
age: 18 }

>db.students.find({age : 18}).count()
<2
  • “db.clname.update()” $set 修改属性,$unset 删除属性。默认只修改一个。已过时

    “db.clname.updateOne()” 修改单个 document 的字段。

    “db.clname.updateMany()” 修改多个 document 的字段。

    “db.clname.replaceOne()” 替换指定的一整个 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
>db.students.update(
{ name : "zhangsan"},
{
$set : { age : 20, gender : "man"}, // $set 添加字段
$unset : { name : ""} // $unset 删除字段
// $push 向数组添加数据
},
{
multi : true
}
)
>db.students.find({gender : "man"})
<{ _id: ObjectId("633aa225f3b1a9afbafe6fc9"),
age: 20,
gender: 'man' }

>db.students.updateOne(
{ gender : "man" },
{
$set : { name: "zhangsan" }
}
)
>db.students.find({gender : "man"})
<{_id: ObjectId("633aa225f3b1a9afbafe6fc9"),
age: 20,
gender: 'man',
name: 'zhangsan' }

>db.students.replaceOne(
{ name : "zhangsan"},
{
name : "zhangsaner",
age : 21,
gender : "man"
}
)
>db.students.find({name : "zhangsaner"})
<{_id: ObjectId("633aa225f3b1a9afbafe6fc9"),
name: 'zhangsaner',
age: 21,
gender: 'man' }
  • “db.clname.remove()” 删除符合条件的多个 document。已过时

    “db.clname.deleteOne()” 删除符合条件的多个 document。

    “db.clname.deleteMany()” 删除符合条件的多个 document。

1
2
3
4
5
6
7
8
>db.students.deleteOne({name : "zhangsaner"})
>db.students.find()
<{ _id: ObjectId("633aa225f3b1a9afbafe6fca"),
name: 'lisi',
age: 19 }
{ _id: ObjectId("633aa529f3b1a9afbafe6fcb"),
name: 'wangwu',
age: 18 }
  • 嵌套多层查询,属性名必须作为一整个字符串,用引号包裹。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
>db.students.updateOne(
{ name : "lisi" },
{
$set : {
address: {
country : "China",
city : "Beijing"
}
}
}
)
>db.students.find({ "address.country" : "China"})
<{_id: ObjectId("633aa225f3b1a9afbafe6fca"),
name: 'lisi',
age: 19,
address: { country: 'China', city: 'Beijing' } }
  • $gt 大于,$lt小于

    $or 或关系,值为一个数组,数组内存放各个条件表达式

    $inc 增加

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
>db.students.find( // 大于 18 且小于20
{
age : {
$gt : 18,
$lt : 20
}
}
)
<{ _id: ObjectId("633aa225f3b1a9afbafe6fca"),
name: 'lisi',
age: 19,
address: { country: 'China', city: 'Beijing' } }

>db.students.updateMany( // 年龄大于 18 或名字叫 "wangwu" 的 age 属性加 5
{
$or : [
{
age : {$gt : 18}
},
{
name : "wangwu"
}
]
},
{
$inc : {
age : 5
}
}
)
>{ _id: ObjectId("633aa225f3b1a9afbafe6fca"),
name: 'lisi',
age: 19,
address: { country: 'China', city: 'Beijing' } }
{ _id: ObjectId("633aa529f3b1a9afbafe6fcb"),
name: 'wangwu',
age: 18 }

  • limit() 限制查询数量

    skip() 跳过指定数量

1
>db.students.find().skip(10).limit(10) // 显示第 11 到第 20 条数据
  • sort() 根据指定属性排序,1 为升序, -1 为降序

    find() 第二个参数可以指定查询的列

1
>db.students.find({}, {name : 1, _id : 0}).sort({age : 1, name : -1})

Mongoose

  • 安装后引入
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
// npm install mongoose

// 引入
var mongoose = require('mongoose');
// 连接
mongoose.connect('mongodb://localhost/test');

mongoose.connection.on('error', function() {
console.log("数据库连接失败")
});
mongoose.connection.once('open', function() {
console.log("数据库连接成功")
});

// 一般情况下,连接一次后除非项目关闭,否则不断开连接
mongoose.connection.once('close', function() {
console.log("数据库断开")
});
mongoose.disconnect();
  • Schema 对象,约束数据库
1
2
3
4
5
6
7
8
var stuSchema = new mongoose.Schema({
name : String,
age : Number,
gender : {
type : String,
default : "male"
}
});
  • Model ,对应 collection。mongoose.model(“modelName”, schemaName);
1
2
3
// 一般大写
// mongoose 会根据 modelName 的复数形式对应数据库中的 collection
var StuModel = mongoose.model("student", stuSchema);

​ 1.插入一条或多条数据

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
StuModel.create({
name : "zhangsan",
age : 18,
gender : "male"
}, function (err) {
if (!err) {
console.log("插入成功");
}
});

StuModel.create([{
name : "li",
age : 19
}, {
name : "wangwu",
age : 20
}], function (err) {
if (!err) {
console.log("插入成功");
}
});

​ 2.查询数据。find(condition, [projection], [options], callback)、findById()、findOne()

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
StuModel.find({
name : "zhangsan"
}, {
name : 1,
age : 1,
_id : 0
}, {
skip : 1,
limit : 2
}, function (err, docs) {
if (!err) {
console.log(docs[0] instanceof StuModel); // true
console.log(docs[0].name);
}
});

​ 3.修改数据。updateOne()、updateMany()

1
2
3
4
5
6
7
8
9
10
11
StuModel.updateOne({
name : "zhangsan"
}, {
$set : {
age : 22
}
}, function (err) {
if (!err) {
console.log("修改成功");
}
})

​ 4.删除数据。deleteOne(condition, callback)、deleteMany()

​ 5.统计数量。count(condition, callback)

1
2
3
4
5
StuModel.count({}, function (err, count){
if (!err) {
console.log("数量为", count);
}
})
  • Document
1
2
3
4
5
6
7
8
StuModel.findOne({
name : "zhangsan"
}, function (err, doc) {
if (!err) {
console.log(doc.get("gender"));
doc.set("age", 30);
}
});
  • 模块化

设置 models 文件夹,存放各个 model 文件

1
2
3
4
5
6
7
8
9
10
11
12
13
// models/students.js

var mongoose = require("mongoose")
var stuSchema = new mongoose.Schema({
name : String,
age : Number,
gender : {
type : String,
default : "male"
}
});
var StuModel = mongoose.model("student", stuSchema);
module.exports = StuModel;