MongoDB基本操作

相关概念

MongoDB是非关系型数据库当中最像关系型数据库的,所以我们通过它与关系型数据库的对比,来了解下它的概念。

MySQLMongoDB
databasedatabase数据库
tablecollection数据库表/集合
rowdocument数据记录行/文档
columnfield数据库字段/域
indexindex索引
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}]})

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值