MongoDB 是一个基于分布式文件存储的数据库。由 C++ 语言编写。旨在为 WEB 应用提供可扩展的高性能数据存储解决方案。 MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。
标准 URI 连接语法:
mongodb://[username:password@]host1[:port1][,host2[:port2],...[,hostN[:portN]]][/[database][?options]]
- mongodb:// 这是固定的格式,必须要指定。
- username:password@ 可选项,如果设置,在连接数据库服务器之后,驱动都会尝试登陆这个数据库
- host1 必须的指定至少一个host, host1 是这个URI唯一要填写的。它指定了要连接服务器的地址。如果要连接复制集,请指定多个主机地址。
- portX 可选的指定端口,如果不填,默认为27017
- /database 如果指定username:password@,连接并验证登陆指定数据库。若不指定,默认打开 test 数据库。
?options 是连接选项。如果不使用/database,则前面需要加上/。所有连接选项都是键值对name=value,键值对之间通过&或;(分号)隔开
例如:使用用户名fred,密码foobar登录localhost的baz数据库。
mongodb://fred:foobar@localhost/baz
创建数据库
MongoDB 创建数据库的语法格式如下:
use DATABASE_NAME
如果数据库不存在,则创建数据库,否则切换到指定数据库。
删除数据库
db.dropDatabase()
以下实例删除了 runoob 数据库中的集合 site:
> use runoob
switched to db runoob
> show tables
site
> db.site.drop()
true
> show tables
>
插入文档
db.COLLECTION_NAME.insert(document)
db.COLLECTION_NAME.insertOne({"a": 3})
db.COLLECTION_NAME.insertMany([{"b": 3}, {'c': 4}])
db.COLLECTION_NAME.save(document)
插入文档你也可以使用 db.COLLECTION_NAME.save(document) 命令。如果不指定 _id 字段 save() 方法类似于 insert() 方法。如果指定 _id 字段,则会更新该 _id 的数据。
更新文档
db.collection.update(
<query>,
<update>,
{
upsert: <boolean>,
multi: <boolean>,
writeConcern: <document>
}
)
- query : update的查询条件,类似sql update查询内where后面的。
- update : update的对象和一些更新的操作符(如 , <script type="math/tex" id="MathJax-Element-1">,</script>inc…)等,也可以理解为sql update查询内set后面的
- upsert : 可选,这个参数的意思是,如果不存在update的记录,是否插入objNew,true为插入,默认是false,不插入。
- multi : 可选,mongodb 默认是false,只更新找到的第一条记录,如果这个参数为true,就把按条件查出来多条记录全部更新。
- writeConcern :可选,抛出异常的级别。
db.col.update({'title':'MongoDB 教程'},{$set:{'title':'MongoDB'}},{multi:true})
save()方法
db.collection.save(
<document>,
{
writeConcern: <document>
}
)
删除文档
db.collection.remove(
<query>,
{
justOne: <boolean>,
writeConcern: <document>
}
)
参数说明:
- query :(可选)删除的文档的条件。
- justOne : (可选)如果设为 true 或 1,则只删除一个文档。
- writeConcern :(可选)抛出异常的级别。
如果你想删除所有数据,可以使用以下方式(类似常规 SQL 的 truncate 命令):
>db.col.remove({})
>db.col.find()
如果你只想删除第一条找到的记录可以设置 justOne 为 1
>db.COLLECTION_NAME.remove(DELETION_CRITERIA,1)
查询文档
db.collection.find(query, projection)
db.col.find({key1:value1, key2:value2}).pretty() //key1和key2两个条件AND连接
//key1和key2两个条件OR连接
>db.col.find(
{
$or: [
{key1: value1}, {key2:value2}
]
}
).pretty()
- query :可选,使用查询操作符指定查询条件
projection :可选,使用投影操作符指定返回的键。查询时返回文档中所有键值, 只需省略该参数即可(默认省略)。
limit()方法(读取指定数量的数据)基本语法如下所示:
>db.COLLECTION_NAME.find().limit(NUMBER)
skip() 方法(跳过指定数量的数据)语法格式如下:
>db.COLLECTION_NAME.find().limit(NUMBER).skip(NUMBER)
注:
db.col.find({},{"title":1,_id:0}).limit(2)
//补充说明:
//第一个 {} 放 where 条件,为空表示返回集合中所有文档。
//第二个 {} 指定那些列显示和不显示 (0表示不显示 1表示显示)。
db.COLLECTION_NAME.find().sort({KEY:1}).skip(10).limit(100)
//当查询时同时使用sort,skip,limit,无论位置先后,最先执行顺序 sort再skip再limit。
//sort({KEY:1}) 中key为列字段,1为升序,-1为降序
索引
语法中 Key 值为你要创建的索引字段,1为指定按升序创建索引,如果你想按降序来创建索引指定为-1即可。
>db.COLLECTION_NAME.ensureIndex({KEY:1})
聚合
MongoDB中聚合(aggregate)主要用于处理数据(诸如统计平均值,求和等),并返回计算后的数据结果。有点类似sql语句中的 count(*)。
>db.COLLECTION_NAME.aggregate(AGGREGATE_OPERATION)
//例
> db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$sum : 1}}}])
//以上实例类似sql语句:
select by_user, count(*) from mycol group by by_user
管道的概念
管道在Unix和Linux中一般用于将当前命令的输出结果作为下一个命令的参数。
MongoDB的聚合管道将MongoDB文档在一个管道处理完毕后将结果传递给下一个管道处理。管道操作是可以重复的。
表达式:处理输入文档并输出。表达式是无状态的,只能用于计算当前聚合管道的文档,不能处理其它的文档。
这里我们介绍一下聚合框架中常用的几个操作:
- $project:修改输入文档的结构。可以用来重命名、增加或删除域,也可以用于创建计算结果以及嵌套文档。
- $match:用于过滤数据,只输出符合条件的文档。$match使用MongoDB的标准查询操作。
- $limit:用来限制MongoDB聚合管道返回的文档数。
- $skip:在聚合管道中跳过指定数量的文档,并返回余下的文档。
- $unwind:将文档中的某一个数组类型字段拆分成多条,每条包含数组中的一个值。
- $group:将集合中的文档分组,可用于统计结果。
- $sort:将输入文档排序后输出。
- $geoNear:输出接近某一地理位置的有序文档。
//1、$project实例,默认情况下_id字段是被包含的,如果要想不包含_id可以为0
db.article.aggregate(
{ $project : {
_id : 0 ,
title : 1 ,
author : 1 ,
}}
);
//2.$match实例,$match用于获取分数大于70小于或等于90记录,然后将符合条件的记录送到下一阶段$group管道操作符进行处理。
db.articles.aggregate( [
{ $match : { score : { $gt : 70, $lte : 90 } } },
{ $group: { _id: null, count: { $sum: 1 } } }
] );