常用操作
# 新增
创建User集合并添加一条记录
> db.User.save({name:'zhangsan',age:21,sex:true})
> db.User.find()
{"_id": Objectld("4f69e680c9106ee2ec95da66"), "name": "zhangsan", "age": 21,
"sex": true}
1
2
3
4
2
3
4
# 关于 _id
Objectld类型
- 12字节的存储空间,每个字节二位十六进制数字, 是一个24位的字符串
- [0,3] 时间戳字段
- [4,6] 机器字段
- 主机的唯_标识码
- 通常是机器主机名的散列值,确保不同主机生成不同的Objectld,不产生冲突
- [7,8] PID(进程标识符)字段
- 确保在同一台机器上并发的多个进程产生的Objectld是唯一的加上进程标识符
- [9,11] 计数器字段
- 前9个字节保证了同一秒钟不同机器不同进程产生的Objectld是唯一的
- 后3个字节就是一个自动增加的计数器,确保相同进程同一秒产生的Objectld也是不一样
- 同一秒最多允许每个进程拥有16777216个(2^24)不同的Objectld
# 查询
# 单条件查询
# select * from User where name = 'zhangsan'
> db.User.find({name:"zhangsan"})
1
2
2
# 多条件查询 OR
# select * from User where age = 21 or age = 28
> db.User.find({$or:[{age:21}, {age:28}]})
1
2
2
# 查询并过滤指定字段
# select name, age from User where age = 21
> db.User.find({age:21}, {'name':1, 'age':1})
1
2
2
# 排序
在 MongoDB 中使用 sort() 方法对数据进行排序,sort() 方法可以通过参数指定排序的字段
- 1 升序排列
- -1 降序排列
# select * from User order by age
> db.User.find().sort({age:1})
1
2
2
# 分页查询
# select * from User skip 0 limit 3
> db.User.find().skip(0).limit(3)
1
2
2
# IN 查询
# select * from User where age in (21, 26, 32)
> db.User.find({age:{$in:[21,26,32]}})
1
2
2
# COUNT
# select count(*) from User where age >20
> db.User.find({age:{$gt:20}}).count()
1
2
2
# 更新
直接用类似T-SQL条件表达式更新,或用save()更新从数据库返回到文档对象
- 使用save()更新时,只要有_id,那么就更新,否则新增
db.collection.update(criteria, objNew, upsert, mult)
- criteria:需要更新的条件表达式
- objNew:更新表达式
- upsert: 如果标记录不存在,是否插入新文档
- multi:是否更新多个文档
# update Userset age = 100, sex = 0 where name = 'user1'
> db.User.update({name:"zhangsan"}, {$set:{age:100, sex:0}})
1
2
2
# 删除
remove()用于删除单个或全部文档,删除后的文档无法恢复
> db.User.remove(id)
//移除对应id的行
> db.User.remove({})
//移除所有
1
2
3
4
2
3
4
# 聚合
主要用于处理数据,如统计平均值,求和等,并返回计算后的数据结果,类似sql语句中的 count(*)
- 插入示例数据
>db.article.insert({
title: 'MongoDB Overview',
description: 'MongoDB is no sql database',
by_user: 'runoob.com',
url: 'http://www.runoob.com',
tags: ['mongodb', 'database', 'NoSQL'],
likes: 100
})
>db.article.insert({
title: 'NoSQL Overview',
description: 'No sql database is very fast',
by_user: 'runoob.com',
url: 'http://www.runoob.com',
tags: ['mongodb', 'database', 'NoSQL'],
likes: 10
})
>db.article.insert({
title: 'Neo4j Overview',
description: 'Neo4j is no sql database',
by_user: 'Neo4j',
url: 'http://www.neo4j.com',
tags: ['neo4j', 'database', 'NoSQL'],
likes: 750
})
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# 求和 sum
通过字段 by_user 字段对数据进行分组,并计算 by_user 字段相同值的总和
# select by_user, count(*) from article group by by_user
> db.article.aggregate([{$group:{_id:"$by_user", num_tutorial:{$sum:1}}}])
{
"result" : [
{
"_id" : "runoob.com",
"num_tutorial" : 2
},
{
"_id" : "Neo4j",
"num_tutorial" : 1
}
],
"ok" : 1
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 常用聚合表达式
表达式 | 描述 | 实例 |
---|---|---|
$sum | 计算总和 | db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$sum : "$likes"}}}]) |
$avg | 计算平均值 | db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$avg : "$likes"}}}]) |
$min | 获取集合中所有文档对应值得最小值 | db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$min : "$likes"}}}]) |
$max | 获取集合中所有文档对应值得最大值 | db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$max : "$likes"}}}]) |
$push | 在结果文档中插入值到一个数组中 | db.mycol.aggregate([{$group : {_id : "$by_user", url : {$push: "$url"}}}]) |
$addToSet | 在结果文档中插入值到一个数组中,但不创建副本 | db.mycol.aggregate([{$group : {_id : "$by_user", url : {$addToSet : "$url"}}}]) |
$first | 根据资源文档的排序获取第一个文档数据 | db.mycol.aggregate([{$group : {_id : "$by_user", first_url : {$first : "$url"}}}]) |
$last | 根据资源文档的排序获取最后一个文档数据 | db.mycol.aggregate([{$group : {_id : "$by_user", last_url : {$last : "$url"}}}]) |
# 索引操作
索引通常能够极大的提高查询的效率,如果没有索引,MongoDB在读取数据时必须扫描集合中的每个文件并选取那些符合查询条件的记录,这种扫描全集合的查询效率是非常低的,特别在处理大量的数据时,查询可以要花费几十秒甚至几分钟
索引是特殊的数据结构,索引存储在一个易于遍历读取的数据集合中,索引是对数据库表中一列或多列的值进行排序的一种结构
>db.User.createIndex({"name":1})
1
语法中 name值为你要创建的索引字段,1 为指定按升序创建索引,按降序来创建索引指定为 -1 即可
Last Updated: 2022/02/05, 15:58:51