mongo

安装

  • 下载地址
https://www.mongodb.com/download-center?jmp=nav#production
  • 环境变量
PATH = PATH;%MONGO_PATH%
  • 启动配置
mongod --dbpath=d:\mongodb\data\db --port=27017

mongod:启动命令

dbpath:指定文件存储地址

port:默认就是27017,也可以手动指定

# 指定日志
mongod --dbpath=d:\software\mongodb\data\db --logpath=d:\software\mongodb\data\log.txt

# 后台启动
mongod --dbpath=\home\software\mongodb\data\db --fork --logpath=\log\service\mongodb\log

正如看到的,windows是没有fork的,不能够支持后台运行。

不过设置成服务就有这个效果了,具体可以试试

更多参数,可以mongod --help进行查看,或者翻阅博文

基本使用

  • 数据库列表
show dbs;
  • 当前数据库
db;
  • 切换和创建
use godme;

有就切换, 没有就重新创建指定名称数据库。

  • 删除数据库
db.dropDataBase();

删除当前数据库,删除指定数据库之前,记得use database

  • 创建集合
db.createCollection("collectionName")

db.*操作都是当前,注意所处的位置。

collection相当于MySQL中的table

  • 集合列表
show collections;

相当于show tables

  • 删除集合
db.collectionName.drop();

通过collectionName锁定到指定的集合,然后drop

  • 插入数据
db.collectionName.insert({
                         name:"godme",
                         age:99,
                         male:"female"
                         })
  • 插入的数据是json
  • 插入是对于表(collection)而言的操作
  • 字段名称不用引号,数字不用引号,字符串类型需要引号
  • 查询数据
# 全量查询
db.collectionName.find()
# pretty自动显示,更好看
db.collectionName.find().pretty()
# find中可以插入查询条件, 按照条件查询
db.collectionName.find({name:"godme"}).pretty()
# 第二个是显示条件,筛选显示字段
db.collectionName.find({name:"godme"}, {name:0}).pretty()

关于查询条件,有两点需要补充

  • 比较
{"age": {$gt:50}

针对单个属性,可以有其他筛选办法

  • 并列
{{name:"godme"},{age:89}}

并列关系为and,必须同时满足

{$or,[{name:"godme"},{age:89}]}

$or,表示or关系。

  • 更新数据
# 前面查询条件,后面替换
db.collectionName.update({name:"godme"}, {age:123})
# 为了只替换部分,而不是文档覆盖,需要  $set
db.collectionName.update({age:123}, {$set:{name:"godme"}})
# 默认修改匹配第一条,想要多条可以  {multi:true}
db.collectionName.update({male:"female"}, {$set:{age:18}}, {multi:true})
# save会直接覆盖原来的文档,关键save内部必须传id
dbcollectionName.save({
                      ...
                      })

$set,手动使用别忘记了,不指定就成了文档覆盖了,只不过沿用id而已。

嗯,比save方便些。

  • 删除数据
# 移除指定条件查找到的数据
db.collectionName.remove({name:"godme"})
# 默认查到的都会进行删除,第二个参数justOne,true表示只删除匹配的第一条
db.collectionName.remove({name:"godme"}, true)
# 空条件,全匹配,清空 commection
db.collectionName.remove({})
  • 字段比对
符号字段解释
>$gtgreater than
>=$gtegt equal
<$ltless than
<=$ltelt equal
==eqequal
!=nenot equal
{age : {$let : 20}}  # 小于等于 20 
  • 正则匹配
查询书写解释
{name:/GG/}/GG/包含
{name:/^GG/}/^GG/开头
{name:/GG$/}/GG$/结尾

正则相当于模糊查询,而且可以控制字符位置,比较不那么模糊。

  • 类型过滤
db.collectionName.find({name : {$type : 'string'}})

算是筛选的一个分支,可以通过指定字段类型来进行数据的过滤

  • 数量限定
db.collectionName.find({}).limit(5);

查询数据,限定五条,和MySQL中的limit一个含义

db.collectionName.find({}).limit(5).skip(2);

skip:跳过多少条。

如果数据量足够的话,find({}).limit(5)显示的数据是0-5,总共五条。

find({}).limit(5).skip(2)显示的就是2-7,仍然是五条,但是会忽略前面匹配的几条。

skip默认忽略0条,所以不写参数和不用效果是一致的。

  • 数据排序
db.collectionName.find({},{name:1, _id: 0, age: 0}).sort({"name" : 1})

查询还记得不:查询全部的数据,只显示name,其他的忽略。

sort:表示排序

{"name" : 1} :指定需要排序的字段, 以及排序方式

数值顺序
1升序
-1降序
  • 数据索引
# 创建索引
db.collectionName.createIndex({name : 1})
# 复合索引
db.collectionName.createIndex({name : 1, age : -1})
# 添加选项
db.collectionName.createIndex({name : 1, age : -1}, {background : true})

添加索引时后面的1表示顺序,于此判断升序或降序。

索引创建可以添加选项,更多可以翻阅文档

  • 聚合查询
db.collectionName.aggregate([{$group : {name : "$name", number : {$sum : 1}}}])

实际效果相当于

select name, count(*) from collectionName group by name;

$group:表示分组

{name: "$name"}:表示分组标记,$name自动提取具体数值,名称指定即可。

{$sum : 1}:聚合函数,自动计数

{number : {$sum : 1}}:自动计数赋值给number

[]:多个结果分组,需要声明

结合SQL对照加深理解

select name , count(*) from collectionName group by name;

更多聚合操作

符号查询解释
$sum{old : {$sum : "$age"}}求和
$avg{age : {$avg : "$age"}}平均
$min{young : {$min : "$age"}}最小
$max{grater: {$max : "$age"}}最大
$push{arr : {$push : "$age"}}添加到数组
$addToSet{arr : {$addToSet : "$age"}}添加到数组
不创建副本
$first{first : {$first : "$age"}}取聚合文档第一个
$last{last : {$last : "$age"}}取聚合文档最后一个

管道


符号含义
$project修改文档结构
$match过滤数据
$limit限制数量
$skip跳过数量
$unwind拆分
$group分组统计
$sort排序
$geoNea

改名

db.article.aggregate(
    { $project : {
        _id : 0
        name : 1 ,
        age : 0 ,
    }}
 );

只显示name

跳过

db.article.aggregate({ $skip : 5 });

跳过数据5条

筛选

db.articles.aggregate( [
          { $match : { male : "female", age : { $gt : 18, $lte : 30 } } }
                       ] );

征婚条件

性别 : 女

年龄:18 > age and age <= 30

这个应该没问题吧。

管道

db.articles.aggregate( [
          { $match : { male : "female", age : { $gt : 18, $lte : 30 } } },
          { $sort  : { age : 1} } 
                       ] );

筛选之后再排序,优先年轻的。

所谓aggregate聚合,就是相当于已经拿到了全部数据,然后依次执行定义的操作。

前面操作的输出作为下一步操作的输入,原始输入为collection,最后一步的即是输出结果。

# 类比SQL
select * from (select * from beauty);
# 类比shell
ps -ef | grep godme | xargs cat

所以,aggregate就是制定操作逻辑,然后自动顺序执行。

  • 副本
  • 命名
mongod --port 27017 --dbpath "D:\software\mongodb\data\db" --replSet godme

为启动的mongo服务设置实例名称。

  • 添加
rs.add("godme:27010")

客户端连接master以后可以添加副本。

从功能上理解,类似于主从slave,能够备份数据。

但是更加只能,master宕机后副本能够接替主机,放置服务宕机。

  • 其他
# 判断主备
db.isMaster()
# 创建新副本
rs.initiate()
# 副本配置
rs.conf()
# 副本状态
rs.status()
  • 备份和恢复
  • 备份
mongodump -h 127.0.0.1:27017 -d godme -o /home/data/back

mongodump:备份命令

-h:指定连接的mongo服务地址,ip:port,比如127.0.0.1:27017

-d:数据库名称

-o:指定数据导出文件地址

  • 恢复
mongorestore -h 127.0.0.1:27017 -d godme /home/data/back

-h:服务地址

-d:数据库

/home/data/back:指定备份文件

--drop:指定以后先清空再开始恢复,如果有重要数据切勿使用

--dir:可以声明式指定文件位置,和path冲突,只能使用一个。

  • 监控
# 状态监控
mongostat
# top
mongotop
# top 10 
mongotop 10
# 监控各实例锁占用
mongotop --locks

意思都懂,不赘述了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值