MongoDB中的库就类似于传统关系型数据库中库的概念,用来通过不同库隔离不同应用数据
Mongodb中可以建立多个数据库,每一个库都有自己的集合(Collection)
和权限,不同的数据库也放置在不同的文件中,默认的数据库为test,数据库存储在启动指定的data目录中。
集合就是MongoDB文档组,类似于RDBMS(关系型数据库)中表
的概念
集合存在于数据库中,一个库中可以创建多个集合,每个集合没有固定的结构,这意味着可以对集合可以插入不同格式和类型的数据,但通常情况下我们插入集合的数据会有一定的关联性
文档集合中一条条记录(相当于数据库表中的一条条记录)
,是一组键值(key-value)对(即BSON),MongoDB的文档不需要设置相同的字段,并且相同的字段不需要相同的数据类型,这与关系型数据库有很大的区别,也是MongoDB非常突出的特点。
一个简单的文档例子
{"name":"张三", "age":"23"}
RDBMS | MongoDB |
---|---|
数据库 | 数据库 |
表
|
集合 |
行 | 文档 |
列 | 字段 |
认证
客户端连接上服务器默认进入test
数据库,但是如果我们在配置文件中开启了认证·(auth = true)
那么我们需要先切换到admin数据库进行认证,参考,
查看所有库
show databases;
show dbs
演示
注意
admin
:从权限的角度来看,这是"root"数据库,要是将一个用户添加到这个数据库,这个用户自动继承所有数据库的权限,一些特定的服务器端命令也只能从这个数据库运行,比如列出所有的数据库或者关闭服务器
local
:这个数据永远不会被复制,可以用来存储仅限于本地单台服务器的任意集合
config
: 当Mongo用于分片设置时,config数据库在内部使用,用于保存分片的相关信息
创建数据库 & 查看当前使用的数据库
use 库名
db;
注意:use代表创建并使用,当库中没有数据时默认不显示这个库
,
删除数据库
默认删除当前选中的库
db.dropDatabase()
查看库中的所有集合
show collections;
show tables
创建集合
db.createCollection('集合名称',[options])
options可以是如下参数
字段 | 类型 | 描述 |
---|---|---|
capped | 布尔 | (可选) 如果为true,则创建固定集合 。固定集合是指有着固定大小的集合,当达到最大值时,它会自动覆盖最早的文档。当该值为true时,必须指定size参数。 |
size | 数值 | (可选) 为固定集合指定一个最大值,即字节数。如果capped为true,也需要指定该字段。 |
max | 数值 | (可选) 指定固定集合中包含文档的最大数量 |
注意:当集合不存在时,向集合中插入文档也会自动创建该集合
删除集合
db.集合名字.drop()
注意:在MongoDB中每个文档都会有一个_id作为唯一标识,_id默认会自动生成,如果手动指定将使用手动指定的值作为_id的值
单条文档
> db.集合名称.insert({...})
多条文档
> db.集合名称.insertMany(
[文档1, 文档二, ...],
{
writeConcern: 1, //写入策略,默认为1,及要求确认写操作,0是不要求
ordered: true //指定是否按顺序写入,默认为true
}
)
> db.集合名称.insert(
[文档1, 文档2,...]
)
> db.集合名称.find()
> db.集合名称.remove(
<query>,
{
justOne: <boolean>
writeConcern: <document>
}
)
参数说明:
可选
删除的文档的条件 (也是BSON格式)可选
,如果设置为true或1,则只删除一个文档,如果不设置该参数,或使用默认值false,则删除所有匹配条件的文档可选
,抛出异常的级别示例
> db.集合名.remove({}) #删除所有
> db.集合名.remove({_id:12}) #根据_id删除
...
> db.集合名称.update(
<query>,
<update>,
{
upsert: <boolean>,
multi: <boolean>,
writeConcern: <document>
}
)
参数说明
可选
,这个参数的意思是,如果不存在update的记录,是够进行插入. true为插入,默认为false,不插入可选
,mongodb默认为false,只更新找到的第一条记录,如果这个参数为true,就按照条件查出来多条记录全部更新(一般都显示的设置为true)。可选
,抛出异常的级别示例
- db.集合名.update({"name":"张三"}, {name:"李四", age:13})
将集合中name=张三的所有记录更新为 {name:"李四", age:13}, 相当于先删除在更新,不保留原始数据
#加上$set保留原始数据
-db.集合名称.update({"name":"xiaohei"}, {$set:{name:"xiaobai"}})
将集合中第一条name=xiahei的文档,保留文档中的其他数据,只将name更新为xiaobai
-db.集合名称.update({"name":"小黑"}, {$set:{name:"xiaoming"}}, {multi:true})
保留原始文档进行更新,更新所有符合条件的数据
-db.集合名称.update({name:"小黑"}, {$set:{name:"小明"}}, {multi:true, upsert:true})
保留原始数据进行更新,更新符合条件的所有数据,没有条件符合时插入数据
MongoDB查询文档使用find()方法,find()方法以非结构化的方式来显示所有文档
语法
> db.集合名称.find(query, projection)
query
: 可选,使用查询操作符指定查询条件projection
:可选,使用投影操作符返回指定的键(相当于sql-select语句只查询指定的列),查询时返回文档中所有的键值,只需要省略该参数即可.如果需要以易读的方式来读取数据,可以使用pretty()方法,语法格式如下
> db.集合名称.find().pretty()
注意:pretty()方法以格式化的方式来显示所有文档
> db.集合名称.find({key1:value1, key2:value2}).pretty()
类似于where语句 where key1 = value1 and key2 = value2
MongoDB OR条件语句使用了关键字 $or,语法格式如下
> db.集合名称.find(
{
$or:[
{key1:value1}, {key2:value2}
]
}
).pretty()
以下实例演示了 AND 和 OR 联合使用,类似常规 SQL 语句为: ‘where likes>50 AND (by = ‘A’ OR title = ‘B’)’
> db.col.find({"likes": {$gt:50}, $or: [{"by": "A"},{"title": "B"}]}).pretty()
-- 准确查询,即数组中的值必须完全等于查询条件才匹配
> db.集合名称.find({likes:[A, B]})
-- 包含查询,即只要数组包含某个值即匹配,跟上面的不同就是不加[]
> db.集合名称.find({likes:A})
-- $size 按照数组长度查询
> db.集合名称.find({likes:{$size:3}})
MongoDB的模糊查询依靠的是正则表达式
> db.集合名称.find({name:/xxx/(一段正则表达式)})
-- 按照A升序排序,A相同按照B升序排序
> db.集合名称.find().sort({A:1, B:1})
-- 1升序,-1降序
-- 跳过前start条数据,展示rows条数据
> db.集合名称.find().skip(start).limit(rows)
> db.集合名称.count() -- 查询总记录数
> db.集合名称.find().count -- 查询符合条件的总记录数
> db.集合名称.distinct('字段')
> db.集合名称.find({条件}, {name:1, age:1})
-- 1表示保留字段 0表示舍弃字段 注意:1和0不能同时使用
$type按照数据类型进行查询
注意:默认mongoDB中的数字都是Double类型
类型表
示例
如果想获取 A集合中 title 为 String类型 的数据,你可以使用以下命令:
db.A.find({"title" : {$type : 2}})
或
db.A.find({"title" : {$type : 'string'}})