相关概念
MongoDB是非关系型数据库当中最像关系型数据库的,所以我们通过它与关系型数据库的对比,来了解下它的概念。
MySQL | MongoDB | |
---|---|---|
database | database | 数据库 |
table | collection | 数据库表/集合 |
row | document | 数据记录行/文档 |
column | field | 数据库字段/域 |
index | index | 索引 |
primary key | _id | 主键/MongoDB默认将_id字段设为主键 |
MongoDB数据模型
MongDB的最小存储单位是文档(document)对象。文档数据以BSON(Binart-Json)文档的格式存储在磁盘上
MongoDB CRUD操作
创建数据库
-
使用use命令创建数据库 当插入第一条数据时 会创建数据库
use test db.test.insert({_id:1,name:"aaa"})
如果文档未指定_id字段,则MongoDB将具有ObjectId值的_id字段添加到新文档中。
创建集合
如果当前集合不存在 则插入操作将创建该集合
MongoDB中默认的数据库为test 如果没有选择数据库 集合将会放在test库中
另外
数据库名可以是满足以下条件的任意UTF-8字符
-
不能是空字符串(“”)
-
不能含有''(空格)、.、$、/、\、\0(字符)
-
应该全部小写
-
最多64字节
有一些数据库名是保留的
-
admin
-
local
-
config
插入文档
db.collectionname.insertone() 插入单个文档到集合中
db.collectionname.insertmany() 插入多个文档到集合中
db.collectionname.insert() 插入单个或多个文档到集合中
查询文档
语法
db.collection.find(<query>, [projection])
query:可选。使用查询运算符指定选择筛选器。若要返回集合中的所有文档忽略此参数 或传递空文档
projection: 可选。指定要在查询筛选器匹配的文档中返回的字段。若要返回匹配文档中的所有字段,省略此参数。
示例数据如下
db.inventory.insertMany([ { item: "journal", qty: 25, size: { h: 14, w: 21, uom: "cm" }, status: "A" }, { item: "notebook", qty: 50, size: { h: 8.5, w: 11, uom: "in" }, status: "A" }, { item: "paper", qty: 100, size: { h: 8.5, w: 11, uom: "in" }, status: "D" }, { item: "planner", qty: 75, size: { h: 22.85, w: 30, uom: "cm" }, status: "D" }, { item: "postcard", qty: 45, size: { h: 10, w: 15.25, uom: "cm" }, status: "A" } ]);
查询操作
检索集合中的所有文档
db.inventory.find({})
上述操作对应的sql语句为
select * from inventory
投影查询
如果要查询结果返回部分字段,则需要使用投射查询(不显示所有字段,只显示指定的字段)
db.inventory.find({},{item:1,qty:1})
_id字段会被默认显示 如果不需要显示 _id字段
则指定 _id:0
条件查询
使用<字段>:<值>表达式实现等值查询:
{ <field1>: <value1>, ... }
如 返回inventory集合中status等于D的所有文档
db.inventory.find({status:"D"})
对应的sql语句为
select * from inventory where status = "D"
分页查询
使用count方法统计记录数
db.集合名.count(query,options)
query: 查询选择条件
options: 可选 用于修改计数的额外选择
分页列表查询
使用limint()指定读取的数量skip()方法跳过指定数量的数据
db.集合名.find().limit(num).skip(num)
排序查询
sort()方法对数据进行排序,可以通过指定参数指定排序字段,并使用1,-1指定升序和降序
语法:
db.集合名.find().sort({key:1/-1})
skip,limit,sort三个放在一起执行的时候,执行顺序是sort,skip,limit
在条件查询中使用查询操作符
在条件查询中可以使用查询操作符来指定多个条件
语法:
{ <field1>: { <operator1>: <value1> }, ... }
如 返回inventory集合中 status等于A或D的所有文档
$in 操作符
db.inventory.find({status:{$in:["A","D"]}})
对应的sql语句为
select * from inventory where status in(A,D)
比较操作符
db.集合名.find({字段名:{$gt/lt/ge/le/ne:值}})
连接操作符
$and/or:[{},{},...]
db.comment.find({$and:[{likenum:{$gte:NumberInt(700)}},{likenum:{$lt:NumberInt(2000)}}]})
db.comment.find({$or:[ {userid:"1003"} ,{likenum:{$lt:1000} }]})
文档更新
语法
db.collection.update(
<query>,
<update>,
{
upsert: <boolean>,
multi: <boolean>,
writeConcern: <document>,
collation: <document>,
arrayFilters: [ <filterdocument1>, ... ],
hint: <document|string> // Available starting in MongoDB 4.2
}
)
参数说明
query: 更新的选择条件。可以使用与find()方法中相同的查询选择器,类似于sql语句中where后面的条件。 在3.0后 当使用upsert:true执行update()时,如果查询使用点表示法在_id字段上指定条件,则MongoDB将拒绝插入新文档
update: 要应用的修改。该值可以是:包含更新运算符表达式的文档,或仅包含:对的替换文档
upsert: 可选 如果设置为true 则在没有与查询条件匹配的文档时创建新文档。默认值为false,如果找不到匹配项,则不会插入新文档
multi: 可选,如果设置为true,则更新符合查询条件的多个文档。如果设置为false,如果找不到匹配项,则不会插入新文档
writeConcern 可选。表示写问题的文档 抛出异常的类别。
collation 可选 指定要用于操作的校对规则
arrayFilters 可选 一个筛选文档数组,用于确定要为数组字段上的更新操作要修改哪些元素
hint 可选。指定用于支持查询谓词的索引的文档或字符串
覆盖修改
修改inventory集合中item为paper的文档,item设置为aaa
db.inventory.update({item:"paper"},{item:"aaa"})
操作完成后发现 这条数据被覆盖
61baf64c2928000069002a27 aaa
局部修改
为了解决这个问题 需要使用修改器$set来实现
将item为notebook的记录,item设置为aaa
db.inventory.update({item:"notebook"},{$set:{item:"aaa"}})
运行完成后 发现只修改了item字段的数据
61baf64c2928000069002a26 aaa 50 (Document) 3 Fields A
批量修改
将multi 指定为true 如果不指定则只更新符合条件的第一条记录
db.inventory.update({item:"aaa"},{$set:{item:"bbb"}},{multi:true})
修改完成之后
bbb 50 (Document) 3 Fields A bbb
删除文档
语法
db.集合名.remove(条件)
db.集合名.remove() 会将数据全部删除
常用命令小结
选择切换数据库:use articledb 插入数据:db.comment.insert({bson数据}) 查询所有数据:db.comment.find(); 条件查询数据:db.comment.find({条件}) 查询符合条件的第一条记录:db.comment.findOne({条件}) 查询符合条件的前几条记录:db.comment.find({条件}).limit(条数) 查询符合条件的跳过的记录:db.comment.find({条件}).skip(条数) 修改数据:db.comment.update({条件},{修改后的数据}) 或db.comment.update({条件},{$set:{要修改部分的字段:数据}) 修改数据并自增某字段值:db.comment.update({条件},{$inc:{自增的字段:步进值}}) 删除数据:db.comment.remove({条件}) 统计查询:db.comment.count({条件}) 模糊查询:db.comment.find({字段名:/正则表达式/}) 条件比较运算:db.comment.find({字段名:{$gt:值}}) 包含查询:db.comment.find({字段名:{$in:[值1,值2]}})或db.comment.find({字段名:{$nin:[值1,值2]}}) 条件连接查询:db.comment.find({$and:[{条件1},{条件2}]})或db.comment.find({$or:[{条件1},{条件2}]})