MongoDB地基本操作
MongoDB基本操作
1.基本命令
- 查看数据库
show dbs
; - 切换以及创建数据库
use DATABASE_NAME
; - 查看集合:
show collections
; - 删除数据库: 先执行
use DATABASE_NAME
再执行db.dropDatabase()
删除所选数据库; - 创建集合:
db.createCollection(name, options)
options
参数如下: - 删除集合:
db.COLLECTION_NAME.drop()
;
2.文档插入和删除
- 插入文档:
db.COLLECTION_NAME.insert(document)
,其中document为BSON格式或者是JSON格式,使用MongoDB Compass还可以导入JSON格式的数据; - 更新文档:
db.COLLECTION_NAME.update(
<query>, // update的查询条件
<update>, // update的对象和一些更新的操作符
{
upset: <boolean>, // 可选参数,如果不存在update记录,是否插入objectNew, true为插入,否则为false
multi: <boolean>, // 可选,mongodb默认为false,只更新找到的第一条记录,如果这个参数为true,就把按条件查出来多条记录全部更新。
writeConcern: <document> // 可选,抛出异常级别
}
);
此外还有save方法,通过传入的文档来替换已有文档。使用如下:
db.COLLECTION_NAME.save(
<document>,
{
writeConcern: <document>
}
)
- 删除文档,语法如下:
db.COLLECTION_NAME.remove(
<query>, // 删除文档的条件
{
justOne: <boolean>, // 可选,如果设置成1,则只删除一个文档,如果不设置该参数,或使用默认值false,则删除所有匹配条件的文档。
writeConceron: <document> // 可选,抛出异常的级别
}
)
3.文档查询
3.1 基本查询
查询的基本语法如下:db.COLLECTION_NAME.find(query, projection)
- query为使用查询操作符制定查询条件;
- projection使用投影操作符返回指定的键。如不指定默认返回文档中所有的键值。
查询格式如下: - 等于:
{key:value}
,相当于RDBMS中的where key = value
; - 小于:
{key:{$lt:value}}
,相当于RDBMS中的where key < value
; - 小于等于:
{key:{$lte:<value>}}
,相当于RDBMS中的where key <= value
; - 大于:
{key:{$gt:value}}
,相当于RDBMS中的where key > value
; - 大于等于:
{key:{$gte:value}}
,相当于RDBMS中的where key >= value
; - 不等于:
{key:{$ne:value}}
,相当于RDBMS中的where key != value
;
3.2 AND条件
db.COLLECTION_NAME.find({key1:value1, key2:value2})
3.3 OR条件
db.COLLECTION_NAME.find(
{
$or:[
{key1:value1},
{key2:value2},
···
]
}
)
3.4 AND与OR联合使用
以如下文档为例:
{
"_id":"5c9d8f1a9465a739743a4ea8",
"title":"MongoDB Server",
"description":"MongoDB is no sql database","by_user":"runoob.com",
"url":"http://www.runoob.com",
"tags":[
"mongodb","database","NoSQL"
],
"likes":100
}
要根据likes或者是title字段进行查询,则查询语句为:
db.COLLECTION_NAME.find("likes":{$gt:50},$or:[{"by_user":"runoob.com",{"title":"MongoDB Server"}}])
分开来写即为:
db.COLLECTION_NAME.find(
"likes":{$gt:50},
$or:[
{
"by_user":"runoob.com",
{
"title":"MongoDB Server"
}
}
])
4. Limit与Skip方法
- limit :
db.COLLECTION_NAME.find().limit(number)
- skip :
db.COLLECTION_NAME.find().limit(number).skip(number)
5.文档聚合
5.1 基本语法
db.COLLECTION_NAME.aggregate(AGGREGATE_OPERATION)
聚合涉及一些表达式,这点与RDBMS也很像,具体如下:
$sum
:计算总和;$avg
:计算平均值;$min
:获取集合中所有文档对应值的最小值;$max
:获取集合中所有文档对应值的最大值;$push
:在结果文档中插入值到一个数组中;$addToSet
:在结果文档中插入到一个数组中,但不创建副本;$first
:根据资源文档的排序获取第一个文档数据;$last
:根据资源文档的排序获取最后一个文档数据;
5.2 聚合中的管道
将MongoDB文档在一个管道处理完毕后将结果传递给下一个管道处理。与Linux系统上的管道符号作用很像。
聚合框架中常用的管道符有如下:
$project
:修改输入文档的结构。可以用来重命名、增加或者删除域,也可以用于创建计算结果以及嵌套文档;$mathch
:用于过滤数据,只输出符合条件的文档。$match使用MongoDB的标准查询条件;$limit
:用来限制MongoDB聚合管道返回的文档数;$skip
:在聚合管道中跳过指定数量的文档,并返回余下的文档;$unwind
:将文档中的某一个数组类型拆分成多条,每条包含数组中的一个值;$group
:将集合中的文档分组,用于统计结果;$sort
:将文档输出后排序;$geoNear
:输出接近某一地理位置的有序文档;
在MongoDB Compass有专门用于聚合文档的选项。
6.文档排序
语法如下:
db.COLLECTION_NAME.find().sort({KEY:1})
sort方法可以通过指定参数来设置排序方式(正序还是反序)。其中1为升序排列,-1为降序排列。
7.文档投影
文档投影就是在筛选记录的时候只筛选出我们需要的字段,而不是默认返回所有字段。
8.索引
索引通常能够极大的提高查询的效率,如果没有索引,MongoDB在读取数据时必须扫描集合中的每个文件并选取那些符合查询条件的记录。
这种扫描全集合的查询效率是非常低的,特别在处理大量的数据时,查询可以要花费几十秒甚至几分钟,这对网站的性能是非常致命的。
索引是特殊的数据结构,索引存储在一个易于遍历读取的数据集合中,索引是对数据库表中一列或多列的值进行排序的一种结构。
语法:
db.COLLECTION_NAME.createIndex({"title":1})
与排序同样,数字1代表升序,-1代表降序。
也可以像RDBMS那样创建复合索引,方式如下:
db.COLLECTION_NAME.createIndex({"key1":"value1"},{"key2:"value2"})
如果有图形化界面,创建索引会更加简单。
高级进阶
9.关系映射
MongoDB的关系表示多个文档之间在逻辑上的相互关系。文档之间可以通过潜入和引用来建立关系。这点与RDBMS完全相同,因此也支持如下关系引用:
- 1 : 1(1对1)
- 1 : N(1对多)
- N : 1(多对1)
- N : N(多对多)
以用户和地址的关系映射为例:
// user
{
"_id":"5c9dbbd99465a739743a4ea9",
"name":"Tom Hanks",
"contact":"987654321",
"dob":"01-01-1991"
}
// address
{
"_id":"5c9dbbf99465a739743a4eaa",
"building":"22 A, Indiana Apt",
"pincode":"123456",
"city":"Los Angeles",
"state":"Californa"
}
嵌入关系
{
"_id":"5c9dbdb551d234397414f6aa",
"name":"Tom Hanks",
"contact":"987654321",
"dob":"01-01-1991",
"address":[
{
"building":"22 A, Indiana Apt",
"pincode":123456,
"city":"Los Angeles",
"state":"California"
},
{
"building":"170 A, Acropolist Apt",
"pincode":456789,
"city":"Los Angeles",
"state":"California"
}
]
}
引用关系
{
"_id":"5c9dbe5651d234397414f6ab",
"name":"Tom Hanks",
"contact":"987654321",
"dob":"01-01-1991",
"address_ids":[
"5c9dbe4b9465a739743a4eab",
"5c9dbbf99465a739743a4eaa"
]
}
手动引用
我们在不同的集合中 (address_home, address_office, address_mailing, 等)存储不同的地址(住址,办公室地址,邮件地址等)。
这样,我们在调用不同地址时,也需要指定集合,一个文档从多个集合引用文档,我们应该使用 DBRefs。
DBRef的使用形式为:
{$ref : , $id : , $db : }
各个字段表示的含义如下:
$ref
:集合名称
$id
:引用的id
$ref
:数据库名称,可选参数
实例如下:
"_id":ObjectId("53402597d852426020000002"),
"address": {
"$ref": "address_home",
"$id": ObjectId("534009e4d852427820000002"),
"$db": "runoob"
},
"contact": "987654321",
"dob": "01-01-1991",
"name": "Tom Benzamin"
查询分析
跟MySQL数据库一样,我们可以使用explain关键字分析MongoDB语句执行地性能。