Node.js、PHP、Java、GO 等服务端语言等能执行增删改查操作,本小节介绍用 mongosh 执行增删改查,在此之前必须连接 MongoDB 实例。增删改查都是针对 document 而言,在执行这些操作之前必须切换到数据库,引用该数据库中的集合。在 mongosh 中运行下面这些命令去展示、切换、创建数据库。
// 显示正在使用的数据库
db
// 列出用户可用的数据库
show dbs
// 切换或创建数据库
use <database>
// 列出当前数据库所有的集合
show collections
// 向某集合中插入一个document
db.<collection>.insertOne({....})
db.getCollection("<collection>").insertOne({....})
use 后跟数据库名,如果该数据库不存在,那么会先创建它再切换到这个数据库,如果已经存在,那么直接切换到该数据库。上述 <collection>
指的是某特定集合,如果该集合不存在,那么会先创建再进行后续操作,如果已经存在,则直接进行后续操作。
1.插入操作
它是指为某个集合添加新的 document。如果该集合不存在,则先创建该集合。运行下面的命令为名为student 的集合添加一条新的 document。
db.student.insertOne({
name: 'heyu',
age: 12,
grade: 6
})
运行下面的命令为名为 student 的集合添加多条新的 document。
db.student.insertMany([
{
name: 'Li',
age: 11,
grade: 6
},
{
name: 'bella',
age: 13,
grade: 6
}
])
使用insertOne()和insertMany()为集合添加新的document时,如果给函数传递的document没有指定_id字段,那么MongoDB会在每个document中添加类型为ObjectId的_id字段。这两个函数都会返回新添加的document。
2.查询操作
它是指查询某个集合中的 document。运行下面的命令查询集合中全部的 document。
db.student.find()
执行下面的命令查询name字段为 ‘heyu’的 document。
db.student.find( { name: 'heyu' } )
执行下面的命令列出 age 字段大于 12 的 document
db.student.find( { age: { $gt: 12 } } )
上述$gt
是一个比较运算符,除了$gt
还有如下的比较运算符。
名称 | 描述 |
---|---|
$eq | 匹配与指定值相等的数值 |
$gt | 匹配大于指定值的数值 |
$gte | 匹配大于等于指定值的数值 |
$in | 匹配数组中指定的任何一个值 |
$lt | 匹配小于指定值的数值 |
$lte | 匹配小于等于指定值的数值 |
$ne | 匹配所有不等于指定值的数值 |
$nin | 匹配数组中没有指定的值 |
执行下面的命令列出 name 为 ‘heyu’ 或者 age 字段值大于 12 的 document。
db.student.find( {
$or: [{age: { $gt: 12 }}, {name: 'heyu'}]
})
上述$or
是逻辑运算符,除了$or
还有如下的逻辑运算符.
名称 | 描述 |
---|---|
$and | 逻辑与,返回同时匹配两个子句的 Document |
$or | 逻辑或,返回匹配任一子句的 Document |
$not | 逻辑非,返回与查询表达式不匹配的 Document |
$nor | 逻辑或非,它是逻辑或的反面,返回不匹配全部子句的 Document。 |
3.更新操作
它是指更新集合中已存在的 document。执行下面的命令更新集合中 grade 字段值为 6 的第一个 document。
db.student.updateOne({ grade: 6 }, { $set: { name: 'xiao hua' }, $currentDate: { lastModified: true } })
上述$set
操作符将 name 字段的值更新为 ‘xiao hua’;$currentDate
操作符将 lastModified 字段的值更新为当前日期。如果 lastModified 字段在 document 中不存在,那么$currentDate
会为 document 创建该字段。$set
和$currentDate
都属于更新操作符,下表罗列了全部更新操作符。
名称 | 描述 |
---|---|
$currentDate | 将字段的值设置为当前日期,可以是也可以是时间戳。 |
$inc | 将字段的值在现在的基础上增加指定的数量。 |
$min | 当指定的值小于现有字段的值时才更新字段。 |
$max | 当指定的值大于现有字段的值时才更新字段。 |
$mul | 将该字段的值在现在的基础上乘以指定的数量。 |
$rename | 修改字段名 |
$set | 以指定的值更新字段 |
$setOnInsert | 如果更新操作导致一个 Document 被添加到 Collection中,那么$setOnInsert 将指定的值分配给 Document 中的字段。如果更新操作没有导致新增 Document,$setOnInsert 不做任何事情。 |
$unset | 从 Document 中删除指定的字段 |
执行下面的命令将集合中 grade 字段为 6 的全部 document 的 age 字段在现在的基础上加 1。
db.student.updateMany({ grade: 6 }, { $inc: { age: 1 } })
执行下面的命令将集合中 name 字段为’xiao hua’的第一个 document 替换成 { name: ‘heyu’ }。
db.student.replaceOne({name: 'xiao hua'}, { name: 'heyu' })
updateOne 只更新匹配的 document 中某些字段,replaceOne 会替换掉整个匹配的 document,另外 replaceOne 不能使用更新操作符。
4.删除操作
它是指从集合中删除 document。执行下面的命令删除集合中所有的 document。
db.student.deleteMany({})
执行下面的命令从集合中删除 name 字段为 ‘heyu’ 的全部 document。
db.student.deleteMany({name: 'heyu'})
执行下面的命令从集合中删除 name 字段为 ‘heyu’ 的第一个 document
db.student.deleteOne({name: 'heyu'})