mongo式一款NOSQL数据库,用于存储非结构化数据,mongo是一种用于存储json
的数据数据,可以通过mongo提供的命令解析json获取想要的值。
数据模型
了解关系数据库会很熟悉database,table,row,column
的概念,分别是数据库,表,行,列所组成的二维表,而在mongo中没有存储的是json,在新的数据模型中主要数据模型有db
(数据库),collection
(集合),document
(文档),field
(属性)。
在mongo中一个db
数据库存储多个collection
;一个collection的结构如下:
// collection
{
"userId": 1,
"id": 1,
"title": "delectus aut autem1",
"completed": false
}
{
"userId": 2,
"id": 2,
"title": "delectus aut autem2",
"completed": false
}
而每一个结构就是一个document
(文档):
{
"userId": 2,
"id": 2,
"title": "delectus aut autem2",
"completed": false
}
其中的userId,id
等都是field
(属性)。
安装
- 主机安装
Ubuntu官方安装文档
依次按照官网的命令执行就可以了
左侧可以选安装版本,尽量别选最新的哈,小编在主机上安装时遇到了一些问题导致主机安装未成功。(推荐使用docker 安装)
安装完之后,还需要安装mongo shell用于与mongo server交互,通过命令行的方式操作数据官方下载地址。
mongo shell docs
如果安装没有修改配置文件使用mongosh
会自动连接mongdb://localhost:27017
,如果修改了配置文件或者端口使用mongosh "mongodb://localhost:27017"
编辑端口即可。
mongo会链接一个默认的数据库。
除了使用mongo shell外还可以使用mongo compass
GUI工具,下载地址
mongo compass 内部也集成来mongo sh在左下角
- docker安装
docker pull mongo
docker run --name mongo -id -P mongo
使用docker安装看起来要方便很多,安装成功映射到主机端口和mongo shell和mongo compass是一样的。
命令行操作
CURD
通过mongo shell是直接的操作方式,具体的CURD操作如下:
插入
db.collection.insertOne()
db.collection.insertMany()
>除了上述插入方式外还可以借助mongo compass 导入csv等数据。
更新数据
更新有三个参数,分别是过滤器
,更新内容
,条件
db.inventory.updateOne(
{ item: "paper" },
{
$set: { "size.uom": "cm", status: "P" },
$currentDate: { lastModified: true }
}
)
$set
关键字用于更新具体内容,$currentDate
关键字用于把lastModified
字段设置为最近修改时间,没有该字段就创建。
第一个参数是条件,可以使用比较计算符。
删除数据
db.inventory.deleteMany({ status : "A" })
删除也是匹配删除。
db.inventory.deleteOne( { status: "D" } )
删除一个。
比较关键字都可以使用。
命令行查找
db.collection.find()
查询所有
inventory
是collection名,test
是数据库名,_id
是每个collecttion的标识。
精确匹配
find
内部可以使用{ <field1>: <value1>, ... }
表示查询条件。
find会查询所有的
document
找出filed
匹配的项。{}
不使用关键字的情况下就是json数据,该方法就是查询与其一直的数据。
IN查询
db.inventory.find( { status: { $in: [ "A", "D" ] } } )
in
可以使用or
替换
AND查询
条件一起写就是
and
。
比较查询
$lt
是<
模糊查询$regex
$regex
是like。
$regex: '^p'
为前缀查询,^
起前后缀作用。
- 阶级查询
当然比较的关键字还有很多,后续会介绍。这里介绍另一种查询方法.
,field.nestedField
db.inventory.find( { "size.uom": "in" } )
# 等价
db.inventory.find( { size: { w: 21, h: 14, uom: "cm" } } ) # 不好写
这种方式使用多级阶层的查询。
匹配列表
Json的valu也是支持数组的,也需要匹配列表查询。
精确匹配
只能拥有查询的列表元素。
子集匹配$all
db.inventory.find( { tags: { $all: ["gel"] } } )
只要拥有查询条件的列表元素即可,即查询条件是数据的子集。
单元素查询
db.inventory.find( { tags: "red" } )
查询条件没有列表只有一个元素,所有包含该元素的的数据都会被查询出来。
列表过滤查询
# dim_nml类型为[ 10, 15.25 ]
# 查找小于25的
db.inventory.find( { dim_cm: { $gt: 25 } } )
# db.inventory.find( { dim_cm: { $gt: 15, $lt: 20 } } )
db.inventory.find( { dim_cm: { $gt: 15, $lt: 20 } } )
# $elemMatch关键字用于多条件查询
db.inventory.find( { dim_cm: { $elemMatch: { $gt: 22, $lt: 30 } } } )
在列表中也可以使用比较关键字,用于过滤。
列表索引查询
db.inventory.find( { "dim_cm.1": { $gt: 25 } } )
.1
是列表的索引条件,$gt
是比较条件
列表长度查询
db.inventory.find( { "tags": { $size: 3 } } )
$size
关键字表示列表长度,长度为3的将被查询出来。
列表中json元素查询
db.inventory.insertMany( [
{ item: "journal", instock: [ { warehouse: "A", qty: 5 }, { warehouse: "C", qty: 15 } ] },
{ item: "notebook", instock: [ { warehouse: "C", qty: 5 } ] },
{ item: "paper", instock: [ { warehouse: "A", qty: 60 }, { warehouse: "B", qty: 15 } ] },
{ item: "planner", instock: [ { warehouse: "A", qty: 40 }, { warehouse: "B", qty: 5 } ] },
{ item: "postcard", instock: [ { warehouse: "B", qty: 15 }, { warehouse: "C", qty: 35 } ] }
]);
该数据列表的数据元素也为json。
db.inventory.find( { "instock": { warehouse: "A", qty: 5 } } )
如果列表内部也是json元素,把列表当做一个document处理即可。
指定返回字段查询
直接使用find加条件查询返回所有field。在查询条件后可添加json字段返回指定字段。
db.inventory.find( { status: "A" }, { item: 1, status: 1 } )
甚至可以隐藏掉_id
db.inventory.find( { status: "A" }, { item: 1, status: 1, _id: 0 } )
可以看出
1
是显示,0
是隐藏。
也可以反着用,排除返回
db.inventory.find( { status: "A" }, { status: 0, instock: 0 } )
多层次结构也要使用.
来构造
db.inventory.find( { status: "A" }, { item: 1, status: 1, "size.uom": 1 } )
存在数组的查询也是如此
shell db.inventory.find( { status: "A" }, { item: 1, status: 1, "instock.qty": 1 } )
也可以同时使用比较查询
db.inventory.find( { status: "A" }, { item: 1, status: 1, instock: { $slice: -1 } } )
空值查询
mongo提供了null
关键字用于空值查询。
db.inventory.insertMany([
{ item: null },
])
空值比较查询
db.inventory.find( { item: { $ne : null } } )
有兴趣的话可以了解下$type
和$exists
关键字。
官方方法集合
上述只是介绍了一部分常用的方法,更多一步官方方法集合
包含数据库方法,查询,删除,更新等方法。