启动mongoDB·数据库操作·

1
2
3
4
5
$ sudo service mongodb start   #开启数据库服务

$ mongo #进入数据库操作界面

> exit #退出数据库操作界面

数据库

1
2
3
4
5
6
7
> use 数据库名					#连接到数据库,也算是新建  (如 use test_db)

> db #查看当前连接的数据库

> show dbs # 查看所有的数据库 (可能看不到我们新创建的数据库,因为为空)

> db.dropDatabase() # 销毁数据库

集合

1
2
3
4
5
> db.createCollection("users")	# 创建集合 (示例创建了名为 Users 的集合)

> show collections # 查看已有集合

> db.users.drop() # 删除集合

数据

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
insert([])  向集合中插入数据 (插入数据时,如果 users 集合没有创建会自动创建)
> db.users.insert([
... { name : "jam",
... email : "jam@qq.com"
... },
... { name : "tom",
... email : "tom@qq.com"
... }
... ])

save([]) 修改集合中已有的数据 (只能用这个 通过insert会报错)
> db.users.save([
... { name : "jam",
... email : "jam@qq.com"
... },
... { name : "tom",
... email : "tom@qq.com"
... }
... ])

查询语句

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
find()   查询数据,不加任何参数默认返回所有数据记录 (记得带括号)
> db.users.find()

pretty() 可以使查询输出的结果更美观 (可以通过某些设置来使 find() 本身带有此功能)
> db.post.find().pretty()

MongoDB 逻辑判断 AND 不需要类似于其他数据库的 AND 运算符,当 find() 中传入多个键值对时,MongoDB 就会将其作为 AND 查询处理。
例如 db.post.find({"by":"shiyanlou","to": "chenshi"}).pretty() 它对应的SQL语句 SELECT * FROM post WHERE by = 'shiyanlou' AND to = 'chenshi'
> db.mycol.find({ key1: value1, key2: value2 }).pretty()

MongoDB 中,逻辑判断 OR 查询语句以 $or 作为关键词,列入下面用法: 它对应的关系型 SQL 语句为:SELECT * FROM post WHERE by = 'shiyanlou' OR title = 'MongoDB Overview'
> db.post.find({
$or:[
{"by":"shiyanlou"},
{"title": "MongoDB Overview"}
]
}).pretty()

同时使用 AND 和 OR
gt:大于 greater than
lt:小于 less than
gte:大于或等于 greater than equal
lte:小于或等于 less than equal
> db.post.find({
"likes": {$gt:10},
$or: [
{"by": "shiyanlou"},
{"title": "MongoDB Overview"}
]
}).pretty()

总结:
MongoDB 中基本的查询,find 是查询一个集合中文档的指令,其作用相当于关系型数据库的 SELECT ,通过在 find 方法中添加键值对,可以实现 AND 条件查询;对于 OR 查询,需要使用 $or 变量并且其后加上选择查询的条件数组。

文档

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
带参数的创建集合
* capped:类型为 Boolean,如果为 true 则创建一个固定大小的集合,当其条目达到最大时可以自动覆盖以前的条目。在设置其为 true 时也要指定参数大小;
* autoIndexId:类型为 Boolean,默认为 false,如果设置为 true,则会在 _id 字段上自动创建索引;
* size:如果 capped 为 true 则需要指定,指定参数的最大值,单位为 byte;
* max:指定最大的文档数。
> db.createCollection("shiyanlou2", { capped : 1, autoIndexId : 1, size : 6142800, max : 10000 } ) #带参数

插入文档 (先定义出来,再插入)
> db.COLLECTION_NAME.insert(document)

下面来看一下插入文档的操作实例
> userdoc1=({"user_id":1,"name":"cloud","state":"active","actor":"user","e-mail":"test@qq.com","VM_num":2,"time":[{"date":"2014-08-12","hour":"10:53 PM"}] })
> userdoc2=({"user_id":2,"name":"testadmin","state":"active","actor":"admin","e-mail":"test@qq.com","VM_num":2,"time":[{"date":"2014-08-11","hour":"06:34 AM"}] })
> doc1=({"name":"peter","position":"teacher"}) #先定义文档

> use Chenshi
switched to db Chenshi #代表执行成功
> db.shiyanlou.insert(userdoc1)
WriteResult({"nInserted":1}) #代表执行成功
> db.shiyanlou.insert(userdoc2)
WriteResult({"nInserted":1}) #代表执行成功
> db.shiyanlou.insert(doc1)
sWriteResult({"nInserted":1}) #代表执行成功

更新文档
> db.COLLECTION_NAME.update(SELECTION_CRITERIA,UPDATED_DATA)

下面来看一下更新文档的操作实例
> db.shiyanlou.update({"user_id":2,"e-mail":"test@qq.com"},{$set:{"e-mail":"group@qq.com"}})
WriteResult({"nMatched":1,"nUpserted":1,"nModified":1})
> db.shiyanlou.find()
将 user_id=2 的文档的 e-mail 改为 group@qq.com
第一个大括号内容标示查找条件,第二个大括号内容则表示更新后的数据
默认的 update 函数只对一个文档更新,如果想作用所有文档,则需要加入 multi:true
使用$set来完成局部更新的目的,不然整个值都会被替换掉。
> db.shiyanlou.update({"e-mail":"test@qq.com"},{$set:{"e-mail":"group@qq.com"}},{multi:true})
$set 局部更新
{multi:true}
$inc 对原有值增加或减少时使用

替换已存在的文档
> db.COLLECTION_NAME.save({_id:ObjectId(),NEW_DATA})

下面来看一下替换文档的操作实例
> db.shiyanlou.save({"_id":ObjectId("53ea174ccb4c62646d9544f4"),"name":"Bob","position":"techer"})
WriteResult({"nMatched":1,"nUpserted":1,"nModified":1})
这里的 _id 对应的是要替换文档的 _id。
跟 insert 差不多,但是 save 更好用。

删除文档
> db.COLLECTION_NAME.remove(DELECTION_CRITERIA)

下面来看一下删除文档的操作实例
> db.shiyanlou.remove({"name":"Bob"})
WriteResult({"nRemoved":1})
其实 remove 函数的参数跟 update 函数的第一个参数一样,相当于查找条件,注意,不要误删!

各种操作符

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
MongoDB 中的条件操作符有:
$gt:大于
$lt:小于
$gte:大于等于
$lte:小于等于

$type:[key]

可选的 key 值如下:
1: 双精度型(Double)
2: 字符串(String)
3: 对象(Object)
4: 数组(Array)
5: 二进制数据(Binary data)
7: 对象 ID(Object id)
8: 布尔类型(Boolean)
9: 日期(Date)
10: 空(Null)
11: 正则表达式(Regular Expression)
13: JS 代码(Javascript)
14: 符号(Symbol)
15: 有作用域的 JS 代码(JavaScript with scope)
16: 32 位整型数(32-bit integer)
17: 时间戳(Timestamp)
18: 64 位整型数(64-bit integer)
-1: 最小值(Min key)
127: 最大值(Max key)

////////////////////////////////////////////

limit() 与 skip()
读取指定数量的数据记录 limit()。
范例:
> db.shiyanlou.find().limit(1)
读取一条记录,默认是排在最前面的那一条被读取。

读取时跳过指定数量的数据记录 skip()。
范例:
> db.shiyanlou.find().limit(1).skip(1)
当然,还可以添加 find 的查找条件的参数,以便进行更精确的查找。

////////////////////////////////////////////

sort()
与 sqlite 中的排序一样有升序和降序,其中升序用 1 表示,降序用 -1 表示。
语法:db.COLLECTION_NAME.find().sort({KEY:1|-1})

范例:
> db.shiyanlou.find().sort({"time":1})

索引

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
索引是特殊的数据结构,索引存储在一个易于遍历读取的数据集合中,索引是对数据库集合中一个文档或多个文档的值进行排序的一种结构。
> db.COLLECTION_NAME.ensureIndex({KEY:1|-1})

ensureIndex() 的可选参数:

参数 类型 描述
background Boolean 建立索引要不要阻塞其他数据库操作,默认为 false
unique Boolean 建立的索引是否唯一,默认 false
name string 索引的名称,若未指定,系统自动生成
dropDups Boolean 建立唯一索引时,是否删除重复记录,默认 flase
sparse Boolean 对文档不存在的字段数据不启用索引,默认 false
expireAfterSeconds integer 设置集合的生存时间,单位为秒
v index version 索引的版本号
weights document 索引权重值,范围为 1 到 99999
default-language string 默认为英语
language_override string 默认值为 language

范例:
> db.shiyanlou.ensureIndex({"user_id":1,"name":1},{background: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
语法:
> db.COLLECTION_NAME.aggregate({
$match:{x:1},
{limit:NUM},
$group:{_id:$age}
})

这些参数都可选:
$match:查询,跟 find 一样;
$limit:限制显示结果数量;
$skip:忽略结果数量;
$sort:排序;
$group:按照给定表达式组合结果。

范例:
> db.shiyanlou.aggregate([{$group:{_id:"$name", user:{$sum:"$user_id"}}}])

$name 意为取得 name 的值。

////////////////////////////////////////////////////////////////

聚合表达式

名称 描述
$sum 计算总和 $sum:1同count表示计数
$avg 计算平均值
min和max 计算最小值和最大值
$push 在结果文档中插入值到一个数组
$addToSet 在结果文档中插入值到一个数组,但不创建副本
$first 根据资源文档的排序获取第一个文档数据
$last 根据资源文档的排序获取最后一个文档数据

///////////////////////////////////////////////////////////////////

管道

MongoDB 的聚合管道将 MongoDB 文档在一个管道处理完毕后将结果传递给下一个管道处理。管道操作是可以重复的。

表达式:处理输入文档并输出。表达式是无状态的,只能用于计算当前聚合管道的文档,不能处理其它的文档。

聚合框架中常用的几个操作:

$project:修改输入文档的结构。可以用来重命名、增加或删除域,也可以用于创建计算结果以及嵌套文档。
$match:用于过滤数据,只输出符合条件的文档。$match 使用 MongoDB 的标准查询操作。
$limit:用来限制 MongoDB 聚合管道返回的文档数。
$skip:在聚合管道中跳过指定数量的文档,并返回余下的文档。
$unwind:将文档中的某一个数组类型字段拆分成多条,每条包含数组中的一个值。
$group:将集合中的文档分组,可用于统计结果。//按照给定表达式输出结果
$sort:将输入文档排序后输出。
$geoNear:输出接近某一地理位置的有序文档。
范例:

> db.shiyanlou.aggregate([{$match:{user_id:{$gt:0,$lte:2}}},{$group:{_id:"user",count:{$sum:1}}}])
{"_id":"user","count":2} #像这种就第一个分组条件只是打了个字符串,计数的条件就直接计算了match筛选后的数量
> db.shiyanlou.aggregate([{$match:{user_id:{$gt:0,$lte:2}}},{$group:{_id:"$user_id",count:{$sum:1}}}]) #而这样就是写了列名,根据这一列来筛选

高级查询与索引

1
2
3
4
5
索引的查看   返回一个集合中的所有索引的数组
> db.xxx.getIndexes()

在集合上创建索引。
> db.xxx.createIndex(keys,options)