mongodb操作语句

第一章:逻辑结构

Mongodb 逻辑结构                         MySQL逻辑结构
库database                                 库
集合(collection)                          表
文档(document)                            数据行

第二章:安装部署

1、系统准备

(1)redhat或centos6.2以上系统
(2)系统开发包完整
(3)ip地址和hosts文件解析正常
(4)iptables防火墙&SElinux关闭
(5)关闭大页内存机制
########################################################################
root用户下
在vi /etc/rc.local最后添加如下代码
if test -f /sys/kernel/mm/transparent_hugepage/enabled; then
  echo never > /sys/kernel/mm/transparent_hugepage/enabled
fi
if test -f /sys/kernel/mm/transparent_hugepage/defrag; then
   echo never > /sys/kernel/mm/transparent_hugepage/defrag
fi

cat  /sys/kernel/mm/transparent_hugepage/enabled        
cat /sys/kernel/mm/transparent_hugepage/defrag  
其他系统关闭参照官方文档:   

https://docs.mongodb.com/manual/tutorial/transparent-huge-pages/
---------------
为什么要关闭?
Transparent Huge Pages (THP) is a Linux memory management system 
that reduces the overhead of Translation Lookaside Buffer (TLB) 
lookups on machines with large amounts of memory by using larger memory pages.
However, database workloads often perform poorly with THP, 
because they tend to have sparse rather than contiguous memory access patterns. 
You should disable THP on Linux machines to ensure best performance with MongoDB.
############################################################################    

2、mongodb安装

创建所需用户和组

useradd mongod
passwd mongod

创建mongodb所需目录结构

mkdir -p /mongodb/conf
mkdir -p /mongodb/log
mkdir -p /mongodb/data

上传并解压软件到指定位置

[root@db01 data]# cd   /data
[root@db01 data]# tar xf mongodb-linux-x86_64-rhel70-3.6.12.tgz 
拷贝mongodb下的程序目录到/mongodb
[root@db01 data]#  cp -r /data/mongodb-linux-x86_64-rhel70-3.6.12/bin/ /mongodb

设置目录结构权限

chown -R mongod:mongod /mongodb

设置用户环境变量

su - mongod
vi .bash_profile
export PATH=/mongodb/bin:$PATH
source .bash_profile

启动mongodb

mongod --dbpath=/mongodb/data --logpath=/mongodb/log/mongodb.log --port=27017 --logappend --fork 

登录mongodb

[mongod@server2 ~]$ mongo

使用配置文件

YAML模式

NOTE:
YAML does not support tab characters for indentation: use spaces instead.

--系统日志有关  
systemLog:
   destination: file        
   path: "/mongodb/log/mongodb.log"    --日志位置
   logAppend: true                     --日志以追加模式记录

--数据存储有关   
storage:
   journal:
      enabled: true
   dbPath: "/mongodb/data"            --数据路径的位置

-- 进程控制  
processManagement:
   fork: true                         --后台守护进程
   pidFilePath: <string>              --pid文件的位置,一般不用配置,可以去掉这行,自动生成到data中

--网络配置有关   
net:            
   bindIp: <ip>                       -- 监听地址
   port: <port>                       -- 端口号,默认不配置端口号,是27017

-- 安全验证有关配置      
security:
  authorization: enabled              --是否打开用户名密码验证

------------------以下是复制集与分片集群有关----------------------  

replication:
 oplogSizeMB: <NUM>
 replSetName: "<REPSETNAME>"
 secondaryIndexPrefetch: "all"

sharding:
   clusterRole: <string>
   archiveMovedChunks: <boolean>

---for mongos only
replication:
   localPingThresholdMs: <int>

sharding:
   configDB: <string>
---
++++++++++++++++++++++
YAML例子
cat >  /mongodb/conf/mongo.conf <<EOF
systemLog:
   destination: file
   path: "/mongodb/log/mongodb.log"
   logAppend: true
storage:
   journal:
      enabled: true
   dbPath: "/mongodb/data/"
processManagement:
   fork: true
net:
   port: 27017
   bindIp: 10.0.1.51,127.0.0.1
EOF
mongod -f /mongodb/conf/mongo.conf --shutdown
mongod -f /mongodb/conf/mongo.conf   

mongodb的关闭方式

mongod -f mongo.conf  --shutdown

mongodb 使用systemd管理

su - 
[root@db01 ~]# cat > /etc/systemd/system/mongod.service <<EOF
[Unit]
Description=mongodb 
After=network.target remote-fs.target nss-lookup.target
[Service]
User=mongod
Type=forking
ExecStart=/mongodb/bin/mongod --config /mongodb/conf/mongo.conf
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/mongodb/bin/mongod --config /mongodb/conf/mongo.conf --shutdown
PrivateTmp=true  
[Install]
WantedBy=multi-user.target
EOF

[root@db01 ~]# systemctl restart mongod
[root@db01 ~]# systemctl stop mongod
[root@db01 ~]# systemctl start mongod

3、mongodb常用基本操作*****

3.0 mongodb 默认存在的库

test:登录时默认存在的库
管理MongoDB有关的系统库
admin库:系统预留库,MongoDB系统管理库
local库:本地预留库,存储关键日志
config库:MongoDB配置信息库

show databases / show dbs
show tables / show collections
use admin 
db / select database()

3.1 命令种类

db 对象相关命令

使用tab键查看db.相关的命令
db.[TAB][TAB]
db.help()
查看对象(库)下集合(表)的相关命令
db.test.[TAB][TAB]
db.test.help()

rs 复制集有关(replication set):

rs.[TAB][TAB]
rs.help()

sh 分片集群(sharding cluster)

sh.[TAB][TAB]
sh.help()

4. mongodb对象操作

mongo         mysql
库    ----->  库
集合  ----->  表
文档  ----->  数据行

4.1 库的操作

创建库
use就等于创建(当在库下创建表,库才等于真正的 )
> use test

删除库
>db.dropDatabase()   
{ "dropped" : "test", "ok" : 1 }

4.2 集合的操作

创建集合

方法一:直接创建集合
app> db.createCollection('a')
{ "ok" : 1 }
app> db.createCollection('b')

方法2:当插入一个文档的时候,一个集合就会自动创建。
use oldboy
插入文档
db.test.insert({name:"zhangsan"})
db.stu.insert({id:101,name:"zhangsan",age:20,gender:"m"})
db.stu.insert({id:102,name:"lisi"})
db.stu.insert({a:"b",c:"d"})
db.stu.insert({a:1,c:2})

查看库下所有集合
show tables;
删除集合
db.test.drop()
查看集合内容
db.stu.find()

4.3 文档操作

数据查询

数据录入(一万行)
for(i=0;i<10000;i++){db.log.insert({"uid":i,"name":"mongodb","age":6,"date":new
Date()})}

查询数据行数:
> db.log.count()
全表查询:
> db.log.find()
每页显示50条记录:
> DBQuery.shellBatchSize=50; 

按照条件查询
> db.log.find({uid:999})
查询 uid > 22 的记录
  db.log.find({uid: {$gt: 22}})
查询 uid < 22 的记录
  db.log.find({uid:{$lt: 22}})
查询 age >= 25 的记录
  db.log.find({uid: {$gte: 25}})
查询 uid <= 25 的记录
  db.log.find({uid: {$lte: 25}})
查询 uid >= 23 并且 uid <= 26 注意书写格式
  db.log.find({uid: {$gte: 23, $lte: 26}});
查询 uid = 23 或者 uid = 26 注意书写格式
db.log.find({"$or":[{"uid": "23"}, {"uid": "26"}]})
模糊查询 
(//相当于mysql的%%)
> db.user.find({name:/w/})
{ "_id" : ObjectId("5fae973c94f723fd64a992af"), "id" : 1, "name" : "wang", "age" : 10 }
正则查询
 $regex
db.log.find({host:{"$regex":"172"}})
db.log.find({host:{"$regex":"^172"}})
db.log.find({host:{"$regex":"172 .*"}})

以标准的json格式显示数据
> db.log.find({uid:999}).pretty()
{
    "_id" : ObjectId("5cc516e60d13144c89dead33"),
    "uid" : 999,
    "name" : "mongodb",
    "age" : 6,
    "date" : ISODate("2019-04-28T02:58:46.109Z")
}

去重查询(user集合中age都是10,name只有sun和wang)
> db.user.distinct("age")
[ 10 ]
> db.user.distinct("name")
[ "sun", "wang" ]

数据修改

修改字段值update
> db.user.find({})
{ "_id" : ObjectId("5fae973494f723fd64a992ae"), "id" : 1, "name" : "sun", "age" : 10 }
{ "_id" : ObjectId("5fae973c94f723fd64a992af"), "id" : 1, "name" : "wang", "age" : 10 }
{ "_id" : ObjectId("5fae9bf594f723fd64a992b0"), "id" : 2, "name" : "xiao", "age" : 10 }
{ "_id" : ObjectId("5fae9bfd94f723fd64a992b1"), "id" : 3, "name" : "zhang", "age" : 10 }

将user文档里名字为wang的age修改为20
> db.user.update({name:'wang'},{$set:{age:20}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.user.find({})
{ "_id" : ObjectId("5fae973494f723fd64a992ae"), "id" : 1, "name" : "sun", "age" : 10 }
{ "_id" : ObjectId("5fae973c94f723fd64a992af"), "id" : 1, "name" : "wang", "age" : 20 }
{ "_id" : ObjectId("5fae9bf594f723fd64a992b0"), "id" : 2, "name" : "xiao", "age" : 10 }
{ "_id" : ObjectId("5fae9bfd94f723fd64a992b1"), "id" : 3, "name" : "zhang", "age" : 10 }
db.user.update({name:'wang'},{$set:{age:20}})   第一个参数表示查找到该条数据,第二个参数表示修改对应字段值

如果,不写 $set ,则表示,该条数据将被修改为第二个参数中设置的值
> db.user.update({name:'wang'},{age:20})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.user.find({})
{ "_id" : ObjectId("5fae973494f723fd64a992ae"), "id" : 1, "name" : "sun", "age" : 10 }
{ "_id" : ObjectId("5fae973c94f723fd64a992af"), "age" : 20 }
{ "_id" : ObjectId("5fae9bf594f723fd64a992b0"), "id" : 2, "name" : "xiao", "age" : 10 }
{ "_id" : ObjectId("5fae9bfd94f723fd64a992b1"), "id" : 3, "name" : "zhang", "age" : 10 }

以上,修改的只是当前查询条件下,查询到的第一条数据。
如果,我们的查询条件查询到多条数据,我们想将所有查询到的数据都进行同样的修改,
比如,我想修改所有 name = 'zhangsan' 的 age = 21
> db.user.update({name:'zhangsan'},{$set:{age:21}},{multi:true})
WriteResult({ "nMatched" : 3, "nUpserted" : 0, "nModified" : 3 })
> db.user.find({})
{ "_id" : ObjectId("5fae973494f723fd64a992ae"), "id" : 1, "name" : "sun", "age" : 10 }
{ "_id" : ObjectId("5fae973c94f723fd64a992af"), "age" : 20 }
{ "_id" : ObjectId("5fae9bf594f723fd64a992b0"), "id" : 2, "name" : "xiao", "age" : 10 }
{ "_id" : ObjectId("5fae9bfd94f723fd64a992b1"), "id" : 3, "name" : "zhang", "age" : 10 }
{ "_id" : ObjectId("5fb684373491bbcf9c206285"), "id" : 5, "name" : "zhangsan", "age" : 21 }
{ "_id" : ObjectId("5fb6843e3491bbcf9c206286"), "id" : 5, "name" : "zhangsan", "age" : 21 }
{ "_id" : ObjectId("5fb686833491bbcf9c206287"), "id" : 5, "name" : "zhangsan", "age" : 21 }

===============================

数据删除

删除集合中所有记录
> db.log.remove({})
删除集合中一条记录
> db.log.deleteOne({"name":"zhangsan"})
{ "acknowledged" : true, "deletedCount" : 1 }
按条件删除集合中的记录
id大于104
> db.stu.deleteMany({"id":{$gt:104}})
{ "acknowledged" : true, "deletedCount" : 1 }
id小于104
> db.stu.deleteMany({"id":{$lt:104}})
{ "acknowledged" : true, "deletedCount" : 4 }
id等于104
> db.stu.deleteMany({"id":{$eq:104}})
{ "acknowledged" : true, "deletedCount" : 1 }

创建索引

mongodb采用ensureIndex来创建索引
MongoDB有个默认的“_id”的键,一般默认都会有一个默认索引_id,这是唯一也是不能被删除的索引。如果表中有列名是_id则这列就有索引和唯一性。
> db.user.ensureIndex({id:1})
{
    "createdCollectionAutomatically" : false,
    "numIndexesBefore" : 1,
    "numIndexesAfter" : 2,
    "ok" : 1
}
1表示升序排序,也可使用使用数字-1降序。

联合索引
db.user.ensureIndex({"name":1,"age":1})

删除集合所有索引
> db.user.dropIndexes()
{
    "nIndexesWas" : 3,
    "msg" : "non-_id indexes dropped for collection",
    "ok" : 1
}
删除某个索引
> db.user.dropIndex("id_1")
{ "nIndexesWas" : 3, "ok" : 1 }

查看集合的索引信息
> db.user.getIndexes()


查看集合存储信息

单位字节
> db.log.totalSize() //集合中索引+数据压缩存储之后的大小    

5. 用户及权限管理

5.1 注意

验证库: 建立用户时use到的库,在使用用户时,要加上验证库才能登陆。

对于管理员用户,必须在admin下创建.
1. 建用户时,use到的库,就是此用户的验证库
2. 登录时,必须明确指定验证库才能登录(远程连接)
3. 通常,管理员用的验证库是admin,普通用户的验证库一般是所管理的库设置为验证库
4. 如果直接登录到数据库,不进行use,默认的验证库是test,不是我们生产建议的.
5. 从3.6 版本开始,不添加bindIp参数,默认不让远程登录,只能本地管理员登录。

5.2 用户创建语法

use admin 
db.createUser
{
    user: "<name>",
    pwd: "<cleartext password>",
    roles: [
       { role: "<role>",
     db: "<database>" } | "<role>",
    ...
    ]
}

基本语法说明:
user:用户名
pwd:密码
roles:
    role:角色名
    db:作用对象 
role:root, readWrite,read   
验证数据库:
mongo -u oldboy -p 123 10.0.0.53/oldboy

5.3 用户管理例子

创建超级管理员:管理所有数据库(必须use admin再去创建)
$ mongo
use admin
db.createUser(
{
    user: "root",
    pwd: "root123",
    roles: [ { role: "root", db: "admin" } ]
}
)

验证用户

> db.auth('root','root123')
1

配置文件中,加入以下配置

security:
  authorization: enabled

重启mongodb

mongod -f /mongodb/conf/mongo.conf --shutdown 
mongod -f /mongodb/conf/mongo.conf 

登录验证

mongo -uroot -proot123  admin
mongo -uroot -proot123  10.0.0.53/admin

或者
mongo
use admin
db.auth('root','root123')

查看用户:

use admin
db.system.users.find().pretty()

创建应用用户

use oldboy
db.createUser(
    {
        user: "app01",
        pwd: "app01",
        roles: [ { role: "readWrite" , db: "oldboy" } ]
    }
)

mongo  -uapp01 -papp01 app

查询mongodb中的用户信息

mongo -uroot -proot123 10.0.1.51:27017/admin
db.system.users.find().pretty()

5.4 删除用户(root身份登录,use到验证库)

删除用户
db.createUser({user: "app02",pwd: "app02",roles: [ { role: "readWrite" , db: "oldboy1" } ]})
mongo -uroot -proot123 10.0.0.53/admin
use oldboy1
db.dropUser("app02")

5.5 用户管理注意事项

1\. 建用户要有验证库,管理员admin,普通用户是要管理的库
2\. 登录时,注意验证库
mongo -uapp01 -papp01 10.0.0.51:27017/oldboy
3\. 重点参数
net:
   port: 27017
   bindIp: 10.0.0.51,127.0.0.1
security:
   authorization: enabled

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 151,688评论 1 330
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 64,559评论 1 273
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 101,749评论 0 226
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 42,581评论 0 191
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 50,741评论 3 271
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 39,684评论 1 192
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,122评论 2 292
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 29,847评论 0 182
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 33,441评论 0 228
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 29,939评论 2 232
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,333评论 1 242
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 27,783评论 2 236
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,275评论 3 220
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 25,830评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,444评论 0 180
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 34,553评论 2 249
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 34,618评论 2 249