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 的数据安全性就得到保障了,没有登录的客户端将无法执行任何命令。

最后更新于