Dawn's Blogs

分享技术 记录成长

0%

MongoDB学习 (2) 数据库 集合 文档操作

数据库操作

创建数据库

在 MongoDB 中,使用 use 命令并且插入一条数据,就可以完成创建一个数据库了。

删除数据库

使用 db.dropDatabase() 删除数据库。

集合操作

创建集合

在 MongoDB 中,当插入文档时会自动的创建集合。

使用 createCollection 方法显式的创建集合。

1
db.createCollection(name, options)

options 可以是如下参数:

字段 类型 描述
capped 布尔 (可选)如果为 true,则创建固定集合。固定集合是指有着固定大小的集合,当达到最大值时,它会自动覆盖最早的文档。 当该值为 true 时,必须指定 size 参数。
autoIndexId 布尔 3.2 之后不再支持该参数。(可选)如为 true,自动在 _id 字段创建索引。默认为 false。
size 数值 (可选)为固定集合指定一个最大值,即字节数。 如果 capped 为 true,也需要指定该字段。
max 数值 (可选)指定固定集合中包含文档的最大数量。

删除集合

使用 db.COLLECTION_NAME.drop() 删除集合。

文档操作

MongoDB 针对文档,同样支持增删改查操作,这里特别说明一下查询文档。

查询文档

使用 db.COLLECTION_NAME.find 方法查询文档,find 内部可以填写查询条件。如果需要以易读的方式来读取数据,可以使用 pretty() 方法。如:

1
2
3
4
5
6
7
8
db.col.find({
"likes": {$gt:50},
$or: [
{"by": "xxx"},
{"title": "MongoDB学习"}
]
}
).pretty()

查询条件操作符

查询条件过滤操作符如下:

操作 格式 范例 SQL 语句
等于 {<key>:<value>} db.col.find({"by":"xxx"}).pretty() where by = '菜鸟教程'
小于 {<key>:{$lt:<value>}} db.col.find({"likes":{$lt:50}}).pretty() where likes < 50
小于或等于 {<key>:{$lte:<value>}} db.col.find({"likes":{$lte:50}}).pretty() where likes <= 50
大于 {<key>:{$gt:<value>}} db.col.find({"likes":{$gt:50}}).pretty() where likes > 50
大于或等于 {<key>:{$gte:<value>}} db.col.find({"likes":{$gte:50}}).pretty() where likes >= 50
不等于 {<key>:{$ne:<value>}} db.col.find({"likes":{$ne:50}}).pretty() where likes != 50

也可以利用 $type 检索类型,如 {<key>:{$type:'string'}}

分页查询

MongoDB 中使用 limit 方法和 skip 方法进行分页查询。

1
db.COLLECTION_NAME.find().limit(NUMBER).skip(NUMBER)

排序

使用 sort 方法进行排序,并使用 1 和 -1 来指定排序的方式,其中 1 为升序排列,而 -1 是用于降序排列。

1
db.COLLECTION_NAME.find().sort({KEY:1})

聚合操作

MongoDB 中聚合的方法使用 aggregate 方法,基本语法格式如下:

1
2
3
db.COLLECTION_NAME.aggregate(AGGREGATE_OPERATION)

db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$sum : 1}}}])

一些聚合表达式如下:

表达式 描述 实例
$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 中有管道的概念,MongoDB 的聚合管道将 MongoDB 文档在一个管道处理完毕后将结果传递给下一个管道处理。有以下几个管道操作:

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

举个例子:

1
2
3
4
db.articles.aggregate( [
{ $match : { score : { $gt : 70, $lte : 90 } } },
{ $group: { _id: null, count: { $sum: 1 } } }
] );