MongoDB是一个基于分布式文件存储的数据库。由C++语言编写。旨在为WEB应用提供可扩展的高性能数据存储 解决方案。
MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库 的,它支持的数据结构非常松散,是类似json的bson格式,因此可以存储比较复杂的数据类型。 MongoDB最大的特点是它支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似 关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。 官网:https://www.mongodb.com
拉取镜像
docker pull mongo创建数据挂载目录
mkdir -p /data/mongodb创建并启动容器
docker run --name mongodb -p 27017:27017 -v /data/mongodb:/data/db -d --privileged=true mongo进入容器
docker exec -it mongodb mongo为了更好的理解,下面与SQL中的概念进行对比:
SQL术语/概念MongoDB术语/概念解释/说明databasedatabase数据库tablecollection数据库表/集合rowdocument数据记录行/文档columnfield数据字段/域indexindex索引table joins表连接,MongoDB不支持primary keyprimary key主键,MongoDB自动将_id字段设置为主键在MongoDB中,存储的文档结构是一种类似于json的结构,称之为bson(全称为:Binary JSON)。
> use testdb switched to db testdb #插入数据的两种方法 > db.user.insert({id:1,username:'zhangsan',age:20}) WriteResult({ "nInserted" : 1 }) > db.user.save({id:2,username:'lisi',age:25}) WriteResult({ "nInserted" : 1 }) #查询数据 > db.user.find() { "_id" : ObjectId("5f8fc97799ebb5fde4a50482"), "id" : 1, "username" : "zhangsan", "age" : 20 } { "_id" : ObjectId("5f8fc98999ebb5fde4a50483"), "id" : 2, "username" : "lisi", "age" : 25 }update() 方法用于更新已存在的文档。语法格式如下:
db.collection.update( <query>, <update>, [ upsert: <boolean>, multi: <boolean>, writeConcern: <document> ] )参数说明:
query : update的查询条件,类似sql update查询内where后面的。update : update的对象和一些更新的操作符,也可以理解为sql update查询内set后面的upsert : 可选,这个参数的意思是,如果不存在update的记录,是否插入objNew,true为插入,默认是 false,不插入。multi : 可选,mongodb 默认是false,只更新找到的第一条记录,如果这个参数为true,就把按条件查出来多条 记录全部更新。writeConcern :可选,抛出异常的级别。 > db.user.find() { "_id" : ObjectId("5f8fc97799ebb5fde4a50482"), "id" : 1, "username" : "zhangsan", "age" : 20 } { "_id" : ObjectId("5f8fc98999ebb5fde4a50483"), "id" : 2, "username" : "lisi", "age" : 25 } # 更新数据,将age字段更新为22 > db.user.update({id:1},{$set:{age:22}}) WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 }) > db.user.find() { "_id" : ObjectId("5f8fc97799ebb5fde4a50482"), "id" : 1, "username" : "zhangsan", "age" : 22 } { "_id" : ObjectId("5f8fc98999ebb5fde4a50483"), "id" : 2, "username" : "lisi", "age" : 25 }注意: 如果这样写,会删除掉其他的字段
> db.user.update({id:1},{age:25}更新不存在的字段,会新增字段
>db.user.update({id:2},{$set:{sex:1}})更新不存在的数据,默认不会新增数据 如果设置第一个参数为true,就是新增数据
>db.user.update({id:3},{$set:{sex:1}},true)通过remove()方法进行删除数据,语法如下:
db.collection.remove( <query>, { justOne: <boolean>, writeConcern: <document> } )参数说明:
query :(可选)删除的文档的条件。justOne : (可选)如果设为 true 或 1,则只删除一个文档,如果不设置该参数,或使用默认值 false,则删 除所有匹配条件的文档。writeConcern :(可选)抛出异常的级别 #删除所有满足条件的数据 db.user.remove({age:25}) #仅删除第一条满足条件的数据 db.user.remove({age:25},true)为了简化操作,官方推荐使用deleteOne()与deleteMany()进行删除数据操作
#删除id为1的第一条数据 db.user.deleteOne({id:1}) #删除所有数据 db.user.deleteMany({})MongoDB 查询数据的语法格式如下:
db.user.find([query],[fields] query :可选,使用查询操作符指定查询条件fields :可选,使用投影操作符指定返回的键。查询时返回文档中所有键值, 只需省略该参数即可(默认省略)如果你需要以易读的方式来读取数据,可以使用 pretty() 方法,语法格式如下:
db.col.find().pretty()插入测试数据
db.user.insert({id:1,username:'zhangsan',age:20}) db.user.insert({id:2,username:'lisi',age:21}) db.user.insert({id:3,username:'wangwu',age:22}) db.user.insert({id:4,username:'zhaoliu',age:22})查询测试
#查询全部数据 db.user.find() #只查询id与username字段 db.user.find({},{id:1,username:1}) #查询数据条数 db.user.find().count() #查询id为1的数据 db.user.find({id:1}) #查询小于等于21的数据 db.user.find({age:{$lte:21}}) #and查询,age小于等于21并且id大于等于2 db.user.find({age:{$lte:21}, id:{$gte:2}}) #查询id=1 or id=2 db.user.find({$or:[{id:1},{id:2}]}) #分页查询:Skip()跳过几条,limit()查询条数 #跳过1条数据,查询2条数据 db.user.find().limit(2).skip(1) #按照age倒序排序,-1为倒序,1为正序 db.user.find().sort({age:-1})