目录
- 术语
- 数据库的增删查
- 集合(表)的增删查
- 文档(数据记录行)的增删改查
- 几种逻辑运算符
- 游标的使用
术语
SQL术语/概念 | MongoDB术语/概念 | 解释/说明 |
---|---|---|
database | database | 数据库 |
table | collection | 数据库表/集合 |
row | document | 数据记录行/文档 |
column | field | 数据字段/域 |
index | index | 索引 |
table joins | $lookup | 表连接 |
primary key | primary key | 主键,MongoDB自动将_id字段设置为主键 |
sql和mongodb的示意图
数据库的增删查
创建数据库的语法
use runoob
删除数据库(先切换到该数据库)
db.dropDatabase()
查看所有数据库
show dbs
集合(表)的增删查
创建集合
db.createCollection('runoob')
删除集合(切换到数据库后)
db.runoob.drop()
查看所有集合(切换到数据库后)
show tables
文档(数据记录行)的增删改查
增加文档
旧写法(插入一个或多个)
db.orders.insert({name:'a',message:'sss'},{name:'b'})
推荐写法
插入一个文档,写多个也没用,只生效第一个
db.orders.insertOne({name:'c'},{name:'d'})
插入一个或多个文档
db.orders.insertMany([{name:'d'},{name:'e'}])
删除文档
旧写法(删除该集合下所有符合条件的文档)
justOne:布尔值,是否只删除一个文档
db.orders.remove({name:'d'},justOne:true)
推荐写法
删除单个文档
db.orders.deleteOne({name:'a'})
删除多个文档
db.orders.deleteMany({name:'d'})
更新文档
旧写法
db.collection.update(
<query>,
<update>,
{
upsert,
multi,
writeConcern,
collation
}
)
参数说明:
- <query>:参数设置查询条件。
- <update>:为更新操作符。
- upsert:为布尔型可选项,表示如果不存在 update 的记录,是否插入这个新的文档。true 为插入;默认为 * false,不插入。
- multi:也是布尔型可选项,默认是 false,只更新找到的第一条记录。如果为 true,则把按条件查询出来的* * 记录全部更新。
- writeConcem:表示出错级别。
- collation:指定语言。
//默认只更新一条文档
db.orders.update({name:"f"},{name:"t4"})
//$set操作符 只更新字段:文档中有此条数据时 会和新设置的字段融合
db.orders.update({name:'e'},{$set:{name:'f',massage:'tt'}})
//multi是否更新多行,默认false(但需要配合$set使用)
db.orders.update({name:'f'},{$set:{name:'f1',message:'ttt'}},{multi:true})
//upsert 是否不存在则新增,默认false,查询查询条件是否存在,不存在则新增一条新文档
db.orders.update({name:'cc'},{name:'dd'},{upsert:true})
推荐写法
updateOne更新单条文档,必须含有$set
db.orders.updateOne({name:'f1'},{$set:{message:'dd'}})
//不含原子操作符$set则报错Error: the update operation document must contain atomic operators
db.orders.updateOne({name:'f1'},{message:'dd'})
updateMany更新多条文档(同样必须有$set)
db.orders.updateMany({name:'f1'},{$set:{name:'rrrr'}})
查找文档
查询orders集合下所有文档,只展示name字段,并做展示的美化处理
db.orders.find({},{_id:0,name:1}).pretty()
几种逻辑运算符
操作符 | 说明 |
---|---|
$or | 逻辑或 |
$and | 逻辑与 |
$not | 逻辑非 |
$nor | 逻辑or的取反 |
$exists | 存在逻辑 |
$type | 查询键的数据类型 |
1. $or
Syntax: { $or: [ { <expression1> }, { <expression2> }, ... , { <expressionN> } ] }
筛选salary集合里,tax等于3500 或者 empId等于E10007的文档
筛选salary集合里,tax的值在1701-3500的文档
db.salary.find({$or:[{tax:{$eq:3500}},{empId:'E10007'}]}) //不同的键基于$or操作符的查询
db.salary.find({$or:[{tax:{$eq:3500}},{tax:1700}]}) //相同的键基于$or操作符的查询
db.salary.find({tax:{$in:[1701,3500]}})
2. $and
Syntax: { $and: [ { <expression1> }, { <expression2> } , ... , { <expressionN> } ] }
筛选salary集合里,tax>1700并且tax<=3500的文档
db.salary.find({$and:[{tax:{$gt:1700}},{tax:{$lte:3500}}]})
db.salary.find({$and:[{tax:{$gt:1700}},{'obj.name':'test'}]}) //嵌套文档作为$and查询条件
3. $not
Syntax: { field: { $not: { <operator-expression> } } }
筛选salary集合里,tax>=1700的文档
db.salary.find({tax:{$not:{$lt:1700}}})
4. $nor
Syntax: { $nor: [ { <expression1> }, { <expression2> }, ... { <expressionN> } ] }
筛选salary集合里,empId !== E10007的文档
筛选salary集合里,empId !== E10007的文档 并且 tax<= 1700 的文档
db.salary.find({$nor:[{empId:'E10007'}]})
db.salary.find({$nor:[{empId:'E10007'},{tax:{$gt:1700}}]})
db.salary.find({$or:[{empId:'E10007'},{tax:{$gt:1700}}]})
5. $exists
Syntax: { field: { $exists: <boolean> } }
筛选salary集合里,不存在obj字段的文档
筛选salary集合里,存在obj字段的文档
筛选salary集合里,存在obj字段并且tax>3000的文档
筛选salary集合里,存在obj字段或者tax>3400的文档
//moongoDB中的exists通常是用于判断是否有这个键,而不是SQL中的某个列上存在某个值
db.salary.find({obj:{$exists:false}})
db.salary.find({obj:{$exists:true}})
db.salary.find({$and:[{obj:{$exists:true}},{tax:{$gt:3000}}]}) //复合查询
db.salary.find({$or:[{obj:{$exists:true}},{tax:{$gt:3400}}]}) //复合查询
6. $type 基于类型的查询
筛选salary集合里,域为empId的数据类型为string(1)的文档
db.salary.find({empId:{$type:'string'}})
db.salary.find({empId:{$type:2}})
db.salary.find({empId:{$type:3}})
游标的使用
方法名 | 作用 |
---|---|
hasNext | 判断是否有更多的文档 |
next | 用来获取下一条文档 |
toArray | 将查询结构放到数组中 |
count | 查询的结果为文档的总数量 |
limit | 限制查询结果返回数量 |
skip | 跳过指定数目的文档 |
sort | 对查询结果进行排序 |
objsLeftlnBatch | 查看当前批次剩余的未被迭代的文档数量 |
addOption | 为游标设置辅助选项,修改游标的默认行为 |
hint | 为查询强制使用指定索引 |
explain | 用于获取查询执行过程报告 |
snapshot | 对查询结果使用快照 |
常用有
db.salary.find({}).count()
db.salary.find({}).limit(3) //限制输出条数为3
db.salary.find({}).skip(1) //下标最小是0,不能为负数
db.salary.find({}).sort({tax:1}) //1为升序 -1为降序