一、安装
使用 curl 命令来下载安装:
# 进入 /usr/local
cd /usr/local
# 下载
sudo curl -O https://fastdl.mongodb.org/osx/mongodb-osx-x86_64-3.4.2.tgz
# 解压
sudo tar -zxvf mongodb-osx-x86_64-3.4.2.tgz
# 重命名为 mongodb 目录
sudo mv mongodb-osx-x86_64-3.4.2 mongodb
安装完成后,把 MongoDB 的二进制命令文件目录(安装目录/bin)添加到 PATH 路径中:
export PATH=/usr/local/mongodb/bin:$PATH
二、运行 MongoDB
1、首先创建一个数据库存储目录 /data/db:
sudo mkdir -p /data/db
2、启动 mongodb,默认数据库目录即为 /data/db:
sudo mongod
# 如果没有创建全局路径 PATH,需要进入以下目录
cd /usr/local/mongodb/bin
sudo ./mongod
3 、再打开一个终端进入执行以下命令:
$ cd /usr/local/mongodb/bin
$ ./mongo
MongoDB shell version v3.4.2
connecting to: mongodb://127.0.0.1:27017
MongoDB server version: 3.4.2
Welcome to the MongoDB shell.
……
> 1 + 1
2
>
//控制台输出,不再使用console.log('巴拉巴拉'),而是使用print('巴拉巴拉')
三、常用命令
1、 创建数据库、切换数据库 use DATABASE_NAME
如果数据库不存在,则创建数据库,否则切换到指定数据库。以下实例我们创建了数据库 runoob:
> use runoob
switched to db runoob
> db
runoob
>
2、查看所有数据库 show dbs
> show dbs
local 0.078GB
test 0.078GB
>
3、查看当前在那个数据库,避免进错库 db
> db
runoob
4、查看数据库版本命令:db.version()
> db.version()
3.4.2
5、创建集合 db.createCollection(name, options)
> db.createCollection("mycol", { capped : true,
autoIndexId : true,
size :6142800, max : 10000 } )
7、查看已有集合 show collections
> show collections
mycol
在 MongoDB 中,也可以不集合。插入一些文档时,MongoDB 会自动创建集合
> db.mycol2.insert({"name" : "qianxm"})
> show collections
mycol
mycol2
8、删除
db.集合.remove(条件) #删除文件数据
db.集合.drop() #删除整个集合
db.dropDatabase() #删除整个数据库
//demo
> db.mycol2.drop() #删除
true
> show collections #查看集合列表发现已经删除
mycol
9、插入文档 db.COLLECTION_NAME.insert(document)
>db.col.insert({title: 'MongoDB 呀',
description: 'MongoDB 是一个 Nosql 数据库',
tags: ['mongodb', 'database', 'NoSQL'],
likes: 100
})
WriteResult({ "nInserted" : 1 })
也可以将数据定义为一个变量
> document=({title: 'MongoDB ',
description: 'MongoDB 是一个 Nosql 数据库',
tags: ['mongodb', 'database', 'NoSQL'],
likes: 100
});
> db.col.insert(document)
# 插入单条数据
# 插入单条数据
> var document = db.collection.insertOne({"a": 3})
> document
{
"acknowledged" : true,
"insertedId" : ObjectId("571a218011a82a1d94c02333")
}
# 插入多条数据
> var res = db.collection.insertMany([{"b": 3}, {'c': 4}])
> res
{
"acknowledged" : true,
"insertedIds" : [
ObjectId("571a22a911a82a1d94c02337"),
ObjectId("571a22a911a82a1d94c02338")
]
}
10、查看已插入文档 db.col.find()
> db.col.find()
{ "_id" : ObjectId("5ab4da883abaceb3faebc0f5"), "title" : "MongoDB 呀", "description" : "MongoDB 是一个 Nosql 数据库", "tags" : [ "mongodb", "database", "NoSQL" ], "likes" : 100 }
>db.col.findOne() //查询第一条记录
>
11、更新文档 db.集合.update({查询},{修改})
db.collection.update(
,
,
{
upsert: ,
multi: ,
writeConcern:
}
)
//query : update的查询条件,类似sql update查询内where后面的。
//update : update的对象和一些更新的操作符(如$,$inc...)等,也可以理解为sql update查询内set后面的
//upsert : 可选,这个参数的意思是,如果不存在update的记录,是否插入objNew,true为插入,默认是false,不插入。
//multi : 可选,mongodb 默认是false,只更新找到的第一条记录,如果这个参数为true,就把按条件查出来多条记录全部更新。
//writeConcern :可选,抛出异常的级别。
//修改多条相同的文档,需要设置 multi 参数为 true。
db.col.update({'title':'MongoDB '},{$set:{'title':'MongoDB'}},{multi:true})
//只更新第一条记录:
db.col.update( { "count" : { $gt : 1 } } , { $set : { "test2" : "OK"} } );
//全部更新::
db.col.update( { "count" : { $gt : 3 } } , { $set : { "test2" : "OK"} },false,true );
//只添加第一条:
db.col.update( { "count" : { $gt : 4 } } , { $set : { "test5" : "OK"} },true,false );
//全部添加加进去::
db.col.update( { "count" : { $gt : 5 } } , { $set : { "test5" : "OK"} },true,true );
//全部更新::
db.col.update( { "count" : { $gt : 15 } } , { $inc : { "count" : 1} },false,true );
//只更新第一条记录:
db.col.update( { "count" : { $gt : 10 } } , { $inc : { "count" : 1} },false,false );
//更新单个文档
db.test_collection.updateOne({"name":"abc"},{$set:{"age":"28"}})
//更新多个文档
db.test_collection.updateMany({"age":{$gt:"10"}},{$set:{"status":"xyz"}})
12、删除文档 db.collection.remove()
db.collection.remove(
,
)
//query :(可选)删除的文档的条件。
//justOne : (可选)如果设为 true 或 1,则只删除一个文档。
//writeConcern :(可选)抛出异常的级别。
//移除 title 为 'MongoDB' 的所有文档
db.col.remove({'title':'MongoDB '})
//移除 title 为 'MongoDB' 的第一条记录
db.col.remove({'title':'MongoDB '},1)
//新方法
//删除 status 等于 A 的全部文档:
db.inventory.deleteMany({ status : "A" })
//删除 status 等于 D 的一个文档:
db.inventory.deleteOne( { status: "D" } )
13、查询文档
db.collection.find(query, projection)
//query :可选,使用查询操作符指定查询条件
//projection :可选,使用投影操作符指定返回的键。查询时返回文档中所有键值, 只需省略该参数即可(默认省略)。
//要以易读的方式来读取数据,可以使用 pretty() 方法
db.col.find().pretty()
查询条件 where
查询条件 AND
//MongoDB 的 find() 方法可以传入多个键(key),每个键(key)以逗号隔开,即常规 SQL 的 AND 条件
db.col.find({key1:value1, key2:value2}).pretty()
查询条件 OR
//MongoDB OR 条件语句使用了关键字 $or
db.col.find(
{
$or: [
{key1: value1}, {key2:value2}
]
}
).pretty()
AND 和 OR 联合使用
//以下演示了 AND 和 OR 联合使用,类似常规 SQL 语句为: 'where likes>50 AND (by = '栗子' OR title = 'MongoDB ')'
>db.col.find({"likes": {$gt:50}, $or: [{"by": "栗子"},{"title": "MongoDB "}]}).pretty()
projection 参数的使用方法
//若不指定 projection,则默认返回所有键,指定 projection 格式如下,有两种模式
db.collection.find(query, {title: 1, by: 1}) // inclusion模式 指定返回的键,不返回其他键
db.collection.find(query, {title: 0, by: 0}) // exclusion模式 指定不返回的键,返回其他键
//两种模式不可混用(因为这样的话无法推断其他键是否应返回)
db.collection.find(query, {title: 1, by: 0}) // 错误
//只能全1或全0,除了在inclusion模式时可以指定_id为0
db.collection.find(query, {_id:0, title: 1, by: 1}) // 正确
14、条件操作符 大于 小于
$gt -------- greater than >
$gte --------- gt equal >=
$lt -------- less than <
$lte --------- lt equal <=
$ne ----------- not equal !=
$eq -------- equal =
15、 $type 操作符
MongoDB 中可以使用的类型如下表所示:
//如想获取 "col" 集合中 title 为 String 的数据,可以使用以下命令:
db.col.find({"title" : {$type : 2}})
16、Limit与Skip方法
如果需要在MongoDB中读取指定数量的数据记录,可以使用MongoDB的Limit方法,limit()方法接受一个数字参数,该参数指定从MongoDB中读取的记录条数。
limit()方法基本语法如下所示:
db.COLLECTION_NAME.find().limit(NUMBER)
//比如显示查询文档中的两条记录
> db.col.find({},{"title":1,_id:0}).limit(2)
{ "title" : "PHP 教程" }
{ "title" : "Java 教程" }
//如果没有指定limit()方法中的参数则显示集合中的所有数据。
除了可以使用limit()方法来读取指定数量的数据外,还可以使用skip()方法来跳过指定数量的数据,skip方法同样接受一个数字参数作为跳过的记录条数。
skip() 方法脚本语法格式如下:
db.COLLECTION_NAME.find().limit(NUMBER).skip(NUMBER)
//以下实例只会显示第二条文档数据
>db.col.find({},{"title":1,_id:0}).limit(1).skip(1)
{ "title" : "Java 教程" }
>
注:skip()方法默认参数为 0
17、排序 sort()方法
使用sort()方法对数据进行排序,sort()方法可以通过参数指定排序的字段,并使用 1 和 -1 来指定排序的方式,其中 1 为升序排列,而-1是用于降序排列。
sort()方法基本语法如下:
db.COLLECTION_NAME.find().sort({KEY:1})
//col 集合中的数据如下:
{ "_id" : ObjectId("56066542ade2f21f36b0313a"), "title" : "PHP 教程", "description" : "PHP 是一种创建动态交互性站点的强有力的服务器端脚本语言。", "url" : "http://www.runoob.com", "tags" : [ "php" ], "likes" : 200 }
{ "_id" : ObjectId("56066549ade2f21f36b0313b"), "title" : "Java 教程", "description" : "Java 是由Sun Microsystems公司于1995年5月推出的高级程序设计语言。", "url" : "http://www.runoob.com", "tags" : [ "java" ], "likes" : 150 }
{ "_id" : ObjectId("5606654fade2f21f36b0313c"), "title" : "MongoDB 教程", "description" : "MongoDB 是一个 Nosql 数据库", "url" : "http://www.runoob.com", "tags" : [ "mongodb" ], "likes" : 100 }
// col 集合中的数据按字段 likes 的降序排列:
>db.col.find({},{"title":1,_id:0}).sort({"likes":-1})
{ "title" : "PHP 教程" }
{ "title" : "Java 教程" }
{ "title" : "MongoDB 教程" }
>
skip(), limilt(), sort()三个放在一起执行的时候,执行的顺序是先 sort(), 然后是 skip(),最后是显示的 limit()。
18、 索引 ensureIndex() 方法
索引通常能够极大的提高查询的效率,如果没有索引,MongoDB在读取数据时必须扫描集合中的每个文件并选取那些符合查询条件的记录。
这种扫描全集合的查询效率是非常低的,特别在处理大量的数据时,查询可以要花费几十秒甚至几分钟,这对网站的性能是非常致命的。
索引是特殊的数据结构,索引存储在一个易于遍历读取的数据集合中,索引是对数据库表中一列或多列的值进行排序的一种结构
MongoDB使用 ensureIndex() 方法来创建索引。基本语法格式如下所示:
db.COLLECTION_NAME.ensureIndex({KEY:1})
//语法中 Key 值为要创建的索引字段,1为指定按升序创建索引,如果想按降序来创建索引指定为-1即可。
//示例
db.col.ensureIndex({"title":1})
ensureIndex() 方法中也可以设置使用多个字段创建索引(关系型数据库中称作复合索引)。
db.col.ensureIndex({"title":1,"description":-1})
//后台创建索引:通过在创建索引时加background:true 的选项,让创建工作在后台执行
db.col.ensureIndex({open: 1, close: 1}, {background: true})
19、聚合 aggregate() 方法
aggregate() 方法的基本语法格式如下所示:
db.COLLECTION_NAME.aggregate(AGGREGATE_OPERATION)
//如
> db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$sum : 1}}}])
{
"result" : [
{
"_id" : "runoob.com",
"num_tutorial" : 2
},
{
"_id" : "Neo4j",
"num_tutorial" : 1
}
],
"ok" : 1
}
//以上实例类似sql语句: select by_user, count(*) from mycol group by by_user
//通过字段by_user字段对数据进行分组,并计算by_user字段相同值的总和。
管道的概念
管道在Unix和Linux中一般用于将当前命令的输出结果作为下一个命令的参数。
MongoDB的聚合管道将MongoDB文档在一个管道处理完毕后将结果传递给下一个管道处理。管道操作是可以重复的。
表达式:处理输入文档并输出。表达式是无状态的,只能用于计算当前聚合管道的文档,不能处理其它的文档。
聚合框架中常用的几个管道操作:
match:用于过滤数据,只输出符合条件的文档。limit:用来限制MongoDB聚合管道返回的文档数。
unwind:将文档中的某一个数组类型字段拆分成多条,每条包含数组中的一个值。
sort:将输入文档排序后输出。
$geoNear:输出接近某一地理位置的有序文档。
管道操作符实例
1、$project实例
db.article.aggregate(
{ $project : {
title : 1 ,
author : 1 ,
}}
);
这样的话结果中就只还有_id,tilte和author三个字段了,默认情况下_id字段是被包含的,如果要想不包含_id话可以这样:
db.article.aggregate(
{ $project : {
_id : 0 ,
title : 1 ,
author : 1
}});
2.$match实例
db.articles.aggregate( [
{ $match : { score : { $gt : 70, $lte : 90 } } },
{ $group: { _id: null, count: { $sum: 1 } } }
] );
$match用于获取分数大于70小于或等于90记录,然后将符合条件的记录送到下一阶段$group管道操作符进行处理。
3.$skip实例
db.article.aggregate(
{ $skip : 5 });
经过$skip管道操作符处理后,前五个文档被"过滤"掉。
20、MongoDB 复制(副本集)
MongoDB复制是将数据同步在多个服务器的过程。
复制提供了数据的冗余备份,并在多个服务器上存储数据副本,提高了数据的可用性, 并可以保证数据的安全性。
复制还允许从硬件故障和服务中断中恢复数据。
MongoDB复制原理
mongodb的复制至少需要两个节点。其中一个是主节点,负责处理客户端请求,其余的都是从节点,负责复制主节点上的数据。
mongodb各个节点常见的搭配方式为:一主一从、一主多从。
主节点记录在其上的所有操作oplog,从节点定期轮询主节点获取这些操作,然后对自己的数据副本执行这些操作,从而保证从节点的数据与主节点一致。
MongoDB复制结构图如下所示:
客户端从主节点读取数据,在客户端写入数据到主节点时, 主节点与从节点进行数据交互保障数据的一致性。
副本集特征:
N 个节点的集群
任何节点可作为主节点
所有写入操作都在主节点上
自动故障转移
自动恢复
四、js操作mongoDB
1、新建 mongoShell/goTask.js
var userName = "qianxm"; //声明一个登录名
var timeStamp = Date.parse(new Date()); //声明登录时的时间戳
var jsonDdatabase = {
"loginUser": userName,
"loginTime": timeStamp
}; //组成JSON字符串
var db = connect('log'); //链接数据库
db.login.insert(jsonDdatabase); //插入数据
print('[demo]log print success'); //没有错误显示成功
然后在 mongoShell目录下执行
mongo goTask.js
//localhost:mongoShell qianxuemin$ mongo goTask.js
五、可视化工具 Robo 3T
登录命令 db.auth('qxm','123456')