基本常用命令

1.数据库操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
//选择和创建数据库,如果数据库不存在则自动创建
use 数据库名称
use articledb

//查看有权限查看的所有的数据库命令
show dbs

show databases

//查看当前正在使用的数据库命令
db

//删除数据库
db.dropDatabase()

2.集合操作

1
2
3
4
5
6
7
8
//集合的显式创建(了解)
db.createCollection(name)

//集合的隐式创建(常用
当向一个集合中插入一个文档的时候,如果集合不存在,则会自动创建集合。

//集合删除
db.集合.drop()

3.文档基本CRUD

文档插入

1
2
3
4
5
6
7
8
//单个文档的插入
db.comment.insert(
{
"articleid":"100000",
"content":"今天天气真好",
"userid":"1001",
}
)
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
//批量插入
db.comment.insertMany([
{
"_id":"1",
"articleid":"100001",
"content":"我们不应该把清晨浪费在手机上,健康很重要,一杯温水幸福你我 他。",
"userid":"1002","nickname":"相忘于江湖",
"createdatetime":new Date("2019-08//05T22:08:15.522Z"),
"likenum":NumberInt(1000),
"state":"1"
},
{
"_id":"2",
"articleid":"100001","content":"我夏天空腹喝凉开水,冬天喝温开水",
"userid":"1005","nickname":"伊人憔悴",
"createdatetime":new Date("2019-08-05T23:58:51.485Z"),
"likenum":NumberInt(888),
"state":"1"
},
{
"_id":"4",
"articleid":"100001",
"content":"专家说不能空腹吃饭,影响健康。",
"userid":"1003",
"nickname":"凯撒",
"createdatetime":new Date("2019-08-06T08:18:35.288Z"),
"likenum":NumberInt(2000),"state":"1"
}
]);

如果某条数据插入失败,将会终止插入,但已经插入成功的数据不会回滚掉。

因为批量插入由于数据较多容易出现失败,因此,可以使用try catch进行异常捕捉处理,测试的时候可以不处理。

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
try { 
db.comment.insertMany([
{
"_id":"1",
"articleid":"100001",
"content":"我们不应该把清晨浪费在手机上,健康很重要,一杯温水幸福你我他。",
"userid":"1002",
"nickname":"相忘于江湖",
"createdatetime":new Date("2019-08- 05T22:08:15.522Z"),
"likenum":NumberInt(1000),
"state":"1"
},
{
"_id":"2","articleid":"100001",
"content":"我夏天空腹喝凉开水,冬天喝温开水",
"userid":"1005",
"nickname":"伊人憔悴",
"createdatetime":new Date("2019-08-05T23:58:51.485Z"),
"likenum":NumberInt(888),
"state":"1"
},
......
]);
} catch (e) {
print (e);
}

文档基本查询

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
//要查询集合的所有文档
db.comment.find()
// 或
db.comment.find({})

//按条件查询,在find()中添加参数即可,参数也是json格式
db.comment.find(
{
"userid":"1003"
}
)

//如果只需要返回符合条件的第一条数据,我们可以使用findOne命令来实现,语法和find一样
db.comment.findOne(
{
"articleid":"100001"
}
)

//如果要查询结果返回部分字段,则需要使用投影查询(只查询userid,nickname字段)
db.comment.find(
{
userid:"1003"
},
{
userid:1,
nickname:1
}
)

文档更新

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
51
52
53
54
55
56
57
58
59
60
61
//覆盖的修改,(例如,修改_id为1的记录,likenum修改为1001)
db.comment.update(
{
_id:"1"
},
{
likenum:NumberInt(1001)
}
)
执行后发现此条文档只剩likenum字段

//局部修改,需要使用修改器$set来实现
db.comment.update(
{
_id:"2"
},
{
$set:{
likenum:NumberInt(889)
}
}
)

//批量修改
//默认只修改第一条数据
db.comment.update(
{
userid:"1003"
},
{
$set:{
nickname:"zzh"
}
}
)
//修改所有符合条件的数据
db.comment.update(
{
userid:"1003"
},
{
$set:{
nickname:"zzh"
}
},
{
multi:true
}
)

//列值增长的修改(实现对某列值在原有值的基础上进行增加或减少,可以使用 $inc 运算符来实现)
db.comment.update(
{
_id:"3"
},
{
$inc:{
likenum:NumberInt(1)
}
}
)

删除文档

1
2
3
4
5
6
7
8
9
10
11
12
//语法结构
db.集合名称.remove(条件)

//删除_id=1的记录
db.comment.remove(
{
_id:"1"
}
)

//数据全部删除
db.comment.remove({})

4.分页查询

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
//统计查询(统计comment集合中所有的记录数)
db.comment.count()

//按条件统计,例如,统计userid为1003的记录条数
db.comment.count({userid:"1003"})

//分页列表查询(如果返回指定条数的记录,可以在find方法后调用limit来返回结果(TopN),默认值20)
db.comment.find().limit(3)

//skip方法同样接受一个数字参数作为跳过的记录条数。(前N个不要),默认值是0
db.comment.find().skip(3)


//分页需求:每页2个,第二页开始:跳过前两条数据,接着值显示3和4条数据
//第一页
db.comment.find().skip(0).limit(2)
// 第二页
db.comment.find().skip(2).limit(2)
// 第三页
db.comment.find().skip(4).limit(2)

5.排序查询

sort() 方法对数据进行排序,sort() 方法可以通过参数指定排序的字段,并使用 1 和 -1 来指定排序的方式,其中 1 为升序排列,而 -1 是用于降序排列。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
//语法格式
db.COLLECTION_NAME.find().sort({KEY:1})

db.集合名称.find().sort(排序方式)


//例如,对userid降序排列,并对likenum进行升序排列,并且使用投影查询只查询userid和likenum
db.comment.find(
{},
{
_id:0,
userid:1,
likenum:1
}
).sort(
{
userid:-1,
likenum:1
}
)

6.更多查询

正则的复杂条件查询

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
//MongoDB的模糊查询是通过正则表达式的方式实现的,基本格式为
db.collection.find({field:/正则表达式/})

db.集合.find({字段:/正则表达式/})

//例如,查询评论内容包含“开水”的所有文档
db.comment.find(
{
content:/开水/
}
)

//例如,查询评论的内容中以“专家”开头的
db.comment.find(
{
content:/^专家/
}
)

本部分查询笔记,会导致Algolia索引上传失效,暂时未解决,因此用图片形式展示

比较查询

包含查询

条件连接查询

7.常用命令总结

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
// 选择切换数据库:
use articledb
// 插入数据:
db.comment.insert({bson数据})
// 查询所有数据:
db.comment.find()
//条件查询数据:
db.comment.find({条件})
// 查询符合条件的第一条记录:
db.comment.findOne({条件})
// 查询符合条件的前几条记录:
db.comment.find({条件}).limit(条数)
// 查询符合条件的跳过的记录:
db.comment.find({条件}).skip(条数)
// 修改数据:
db.comment.update({条件},{修改后的数据})

db.comment.update({条件},{$set:{要修改部分的字段:数据})
// 修改数据并自增某字段值:
db.comment.update({条件},{$inc:{自增的字段:步进值}})
// 删除数据:
db.comment.remove({条件}) 统计查询:db.comment.count({条件})
// 模糊查询:
db.comment.find({字段名:/正则表达式/})
// 条件比较运算:
db.comment.find({字段名:{$gt:值}})
// 包含查询:
db.comment.find({字段名:{$in:[值1,值2]}})

db.comment.find({字段名:{$nin:[值1,值2]}})
// 条件连接查询:
db.comment.find({$and:[{条件1},{条件2}]})

db.comment.find({$or:[{条件1},{条件2}]})