MongoDB操作笔记
#MongoDB
安装
[[MongoDB主从集群配置]]
使用
创建/切换数据库:
# 如果有则切换到该库,没有则创建该库
use DatabaseName;删除数据库:
# 切换到该数据库,如果不切换,默认为test库
use DatabaseName;
# 删除命令
db.dropDatabase()查看所有数据库:
show dbs;创建集合/表:
use DatabaseName:
db.createCollection(name, options)options可以是如下参数
capped
布尔
(可选)如果为 true,则创建固定集合。固定集合是指有着固定大小的集合,当达到最大值时,它会自动覆盖最早的文档。当该值为 true 时,必须指定 size 参数。
autoIndexId
布尔.2 之后不再支持该参数。(可选)如为 true,自动在 _id 字段创建索引。默认为 false。
size
数值
(可选)为固定集合指定一个最大值,即字节数。 如果 capped 为 true,也需要指定该字段。
max
数值
(可选)指定固定集合中包含文档的最大数量。
比较查询操作符:
$eq:匹配等于指定值的值。
$ne:匹配不等于指定值的所有值。
$in:匹配数组中指定的任何值。
$nin:不匹配数组中指定的值。
$gt:匹配大于指定值的值。
$gte:匹配大于或等于指定值的值。
$lt:匹配小于指定值的值。
$lte:匹配小于或等于指定值的值。
逻辑操作符:
$and:将查询子句与逻辑连接,并返回与这两个子句条件匹配的所有文档,相当于匹配多个筛选条件全部成立的文档。
$nor:用逻辑NOR连接查询子句,返回所有不能匹配这两个子句的文档,相当于返回多个筛选条件全部不成立的文档。
$or:用逻辑连接查询子句,或返回与任一子句条件匹配的所有文档,相当于返回至少一个筛选条件成立的文档
$not:反转查询表达式的效果,并返回与查询表达式不匹配的文档,相当于返回条件不成立的文档。
元素查询操作符:
$exists:匹配具有指定字段的文档。
$type:如果字段属于指定类型,则选择文档。
评估查询操作符:
$expr:允许在查询语言中使用聚合表达式。
$regex:选择值匹配指定正则表达式的文档。
数组查询操作符:
$all:匹配包含查询中指定的所有元素的数组,相当于返回数组字段中包含所有查询值的文档。
elemMatch:如果数组字段中的元素匹配所有指定的elemMatch:如果数组字段中的元素匹配所有指定的elemMatch:如果数组字段中的元素匹配所有指定的elemMatch条件,则选择文档,相当于匹配数组字段中至少存在一个值满足筛选条件的文档
$size:如果数组字段是指定大小,则选择文档。
插入语句:
use DatabaseName;查询语句:
use DatabaseName;
# 查询表中所有的内容
db.TableName.find()
# 查询表中所有的内容,不显示前10行
db.TableName.find().skip(10)
# 默认查询时排序是按时间的升序排序,以下是按时间降序排列查询
db.getCollection("TableName").find().sort({
endTime: -1
}).limit(10).skip(0)
db.Core_Logs.find().sort({"endTime": -1}).limit(10).skip(0)
# 查询表中与“字段1”条件匹配的内容
db.TableName.find({"字段1":"字段1内容"})
# 查询表中同时符合多个条件的内容
db.TableName.find({$and: [{"字段1":"字段1内容", "字段2": "字段2内容"}]})
db.TableName.find({"字段1":"字段1内容", "字段2": "字段2内容"})
# 查询表中符合任意一个条件的内容
db.TableName.find({$or: [{"字段1":"字段1内容", "字段2": "字段2内容"}]})
# 查询表中数据的行数
db.TableName.find().count()
# 查询表中匹配的字段内容,并只显示指定字段
db.TableName.find({$and: [{"字段1":"字段1内容", "字段2": "字段2内容"}]}, {"要显示的字段1": 1, "要显示的字段2": 2})
# 查询表中匹配的字段内容,并不显示指定字段
db.TableName.find({$and: [{"字段1":"字段1内容", "字段2": "字段2内容"}]}, {"不显示的字段1": 0, "不显示的字段2": 0})
# 字段为空的几种表现方式
db.TableName.find({"字段": null})
db.TableName.find({"字段": []})
db.TableName.find({"字段": ""})
# 模糊查询,/关键字/前后模糊, /^关键字/ 指定关键字开头, /关键字$/ 指定关键字结尾
db.TableName.find({"字段": /关键字/})
db.TableName.find({"字段": /^关键字/})
db.TableName.find({"字段": /关键字$/})
# 只查一个findOne()
db.Table.findOne({"字段": '值'})
不进mongo shell执行命令
mongo 127.0.0.1:27017/DBNAME --eval "db.TableNuame.find().limit(10)"修改默认的查询结果显示为20 篇文档数
Type "it" for more你可以设置 DBQuery.shellBatchSize 属性来修改默认的 20 篇文档数,类似于下面的案例,将默认值设为 100:
DBQuery.shellBatchSize = 100;更新语句:
use DatabaseName;
# 更新符合“字段1”指定内容的部分字段内容,一般用唯一的 _id 做为匹配值
db.TableName.update({"字段1": "字段1的内容", {$set: {"要更新的字段1": "要更新的字段1内容", "要更新的字段2": "要更新的字段2内容"}}})修改字段:
# 语句结构
db.TableName.update({‘查询条件,留空则是所有‘}, {$rename: {'旧字段名':'新字段名'}}, {'参数名': true/false})
# 语句示例
use DababaseName;
# 更新所有数据的'active_status'为'status'
db.TableName.update({}, {$rename: {'active_status':'status'}}, {multi: true})参数说明
upsert
布尔值
可选,这个参数的意思是,如果不存在update的记录,是否插入objNew,true为插入,默认是false,不插入。
multi
布尔值
可选,mongodb 默认是false,只更新找到的第一条记录,如果这个参数为true,就把按条件查出来多条记录全部更新。
writeConcern
布尔值
可选,抛出异常的级别。
删除数据
use DatabaseName;
db.TableName.remove({"字段名":"字段值"},{'参数名': true/false})
# 删除表
use DBName;
db.getCollection("TableName").drop()justOne
(可选)如果设为 true 或 1,则只删除一个文档,如果不设置该参数,或使用默认值 false,则删除所有匹配条件的文档。
writeConcern
(可选)抛出异常的级别。
备份/恢复
整库备份:
mongodump -h dbhost -d dbname -o dbdirectory-h:MongDB所在服务器地址,例如:127.0.0.1,当然也可以指定端口号:127.0.0.1:27017
-d:需要备份的数据库实例,例如:test
-o:备份的数据存放位置,例如:c:\data\dump,当然该目录需要提前建立,在备份完成后,系统自动在dump目录下建立一个test目录,这个目录里面存放该数据库实例的备份数据。
整库恢复:
mongorestore -h dbhost -d dbname dbdirectory-h:MongoDB所在服务器地址
-d:需要恢复的数据库实例,例如:test,当然这个名称也可以和备份时候的不一样,比如test2
directory:备份数据所在位置,例如:c:\data\dump\test,这里为什么要多加一个test,而不是备份时候的dump,读者自己查看提示吧!
–drop:恢复的时候,先删除当前数据,然后恢复备份的数据。就是说,恢复后,备份后添加修改的数据都会被删除,慎用哦!
mongorestore -h dbhost -d dbname -c collectionname file.bson单个collection备份:
mongoexport -h dbhost -d dbname -c collectionname -f collectionKey -o dbdirectory示例:mongoexport -d userdb -c username -o /backup/username.json
-h: MongoDB所在服务器地址
-d: 需要恢复的数据库实例
-c: 需要恢复的集合
-f: 需要导出的字段(省略为所有字段)
-o: 表示导出的文件名
单个collection恢复:
mongoimport -d db -c collectionname --type csv --headerline --file示例:mongoimport -d userdb -c username --type json --file username.json
-type: 指明要导入的文件格式
-headerline: 批明不导入第一行,因为第一行是列名
-file: 指明要导入的文件路径
MongoDB 内置了很多角色,但要注意,不是每个数据库的内置角色都一样。其中 admin 数据库就包含了一些其他数据库所没有的角色。 熟悉 Oracle 的童鞋们都知道,数据库用户有两种,一种是管理员,用来管理用户,一种是普通用户,用来访问数据。类似的,为 MongoDB 规划用户鉴权时,至少要规划两种角色:用户管理员和数据库用户。如果搭建了分片或主从,可能还会要规划数据库架构管理员的角色,它们专门用来调整数据库的分布式架构。 在创建用户之前,我们首先要修改 MongoDB 的启动方式。缺省方式下 MongoDB 是不进行鉴权检查的。我们只要在运行 MongoDB 的命令后面加上一个 --auth 参数即可,例如:
mongod --dbpath ./db1 --port 20000 --auth用户及权限管理
如何创建用户管理员
用户管理员是第一个要创建的用户。在没有创建任何用户之前,你可以随意创建用户;但数据库中一旦有了用户,那么未登录的客户端就没有权限做任何操作了,除非使用db.auth(username, password)方法登录。 用户管理员的角色名叫 userAdminAnyDatabase,这个角色只能在 admin 数据库中创建。下面是一个例子:
> use admin
switched to db admin
> db.createUser({user:"root",pwd:"root123",roles:["userAdminAnyDatabase"]})
Successfully added user: { "user" : "root", "roles" : [ "userAdminAnyDatabase" ] } #这个例子创建了一个名为 root 的用户管理员。创建完了这个用户之后,我们应该马上以该用户的身份登录:
> db.auth("root","root123")
1 # db.auth() 方法返回 1 表示登录成功。接下来我们为指定的数据库创建访问所需的账号。如何创建数据库用户
首先保证你已经以用户管理员的身份登录 admin 数据库。然后用 use 命令切换到目标数据库,同样用 db.createUser() 命令来创建用户,其中角色名为 “readWrite”。 普通的数据库用户角色有两种,read 和 readWrite。顾名思义,前者只能读取数据不能修改,后者可以读取和修改。 下面是一个例子:
> use test
switched to db test
> db.createUser({user:"testuser",pwd:"testpass",roles:["readWrite"]})
Successfully added user: { "user" : "testuser", "roles" : [ "readWrite" ] }
> db.auth("testuser","testpass")
1这样 MongoDB 的数据安全性就得到保障了,没有登录的客户端将无法执行任何命令。
最后更新于