概念
| SQL术语/概念 | MongoDB术语/概念 | 解释/说明 |
|---|---|---|
| database | database | 数据库 |
| table | collection | 数据库表/集合 |
| row | document | 数据记录行/文档 |
| column | field | 数据字段/域 |
| index | index | 索引 |
| table joins | 表连接,MongoDB不支持 | |
| primary key | primary key | 主键,MongoDB自动将_id字段设置为主键 |
本文内容基于mongodb4.x
数据库
创建数据库
如果数据库不存在,则创建数据库,否则切换到指定数据库:
use DATABASE_NAME
查看所有数据库
show dbs
删除数据库
删除当前数据库,默认为 test,你可以使用 db 命令查看当前数据库名:
db.dropDatabase()
修改数据库名称
先复制数据库,再删除原数据库:
db.copyDatabase('old_name', 'new_name')
use old_name
db.dropDatabase()
集合collections
创建集合
可以显式创建,一般都为隐式创建:
# 显式
db.createCollection(name, options)
# 隐式 创建了user集合,并插入一个文档(/一条记录)
db.user.insert({...})
参数options:
| 字段 | 类型 | 描述 |
|---|---|---|
| capped | 布尔 | (可选)如果为 true,则创建固定集合。固定集合是指有着固定大小的集合,当达到最大值时,它会覆盖最早的文档。当值为true,必须指定 size 参数 |
| autoIndexId | 布尔 | 3.2 之后不再支持该参数。(可选)如为 true,自动在 _id 字段创建索引。默认为 false。 |
| size | 数值 | (可选)为固定集合指定一个最大值,即字节数。如果 capped 为 true,也需要指定该字段。 |
| max | 数值 | (可选)指定固定集合中包含文档的最大数量。 |
例子,创建一个名叫 zlfan 且大小固定的集合,整个集合空间 6142800 kb,最大 10000 条文档:
db.createCollection('zlfan',{ capped: true, autoIndexId: true ,size: 6142800, max: 10000 }
查看集合
两条指令均可查询:
show collections
show tables
删除集合
要先切换到目标集合所在的数据库,再执行下述指令:
use DATABASE_NAME
db.COLLECTION_NAME.drop()
修改集合名称
db.OLD_COLLECTION_NAME.renameCollection('NEW_COLLECTION_NAME')
文档
对应关系型数据库记录,即一条记录对应一个文档,文档为JSON数据
插入文档
使用 insert 插入
# 插入一个文档
db.COLLECTION_NAME.insert({document})
# 插入多个文档
db.COLLECTION_NAME.insert( [{document1},{document2},{document3},...] )
3.2版本以后提供了 insertOne() 和 insertMany() 方法,第二个参数可不传
db.COLLECTION_NAME.insertOne(
{document},
{
writeConcern: <document>
}
)
db.COLLECTION_NAME.insertMany(
[ {document 1} , {document 2}, ... ],
{
writeConcern: <document>,
ordered: <boolean>
}
)
writeConcern:写入策略,值也是文档。ordered:指定是否按顺序写入,默认 true,按顺序写入。
例子:
db.COLLECTION_NAME.insertOne(
{ 'name':'zlfan' },
{
writeConcern: { w: 1, wtimeout: 100 },
ordered: true
}
)
参数详细说明请参考:MongoDB 写安全(Write Concern)
查询文档
基础语法
db.COLLECTION_NAME.find(query,[查询的列])
query:条件
查询所有数据 {}或者不写
查询name=zlfan {'name':'zlfan'}
查询name=zlfan且age=18 {'name':'zlfan','age':18}
查询的列(可选参数)
不写-查询全部的列
{name:1} 只显示 name 列
{name:0} 显示除了 name 列
进一步的,查询条件可以带运算符,见下表
db.COLLECTION_NAME.find({
键:{运算符:值}
})
| 运算符 | 说明 |
|---|---|
| $gt | 大于 |
| $gte | 大于等于 |
| $lt | 小于 |
| $lte | 小于等于 |
| $ne | 不等于 |
| $in | in |
| $nin | not in |
# 查询集合的所有文档
db.COLLECTION_NAME.find()
# 查询符合条件的文档
db.COLLECTION_NAME.find( { 'name': 'zlfan' } )
# 查询 age > 18 的文档
db.COLLECTION_NAME.find( { 'age':${gt:18} } )
# 查询 status 为 'A' 或者 'D' 的文档
db.COLLECTION_NAME.find( { status: { $in: [ "A", "D" ] } } )
对于常规SQL的查询条件 and 和 or ,在mongodb中使用$and和$or操作符:
# 查询 name=zlfan 和 age=18 的文档
db.COLLECTION_NAME.find(
{ $and: [{ 'name':'zlfan'},{'age':18 }] }
)
# 查询 age>0 和 age<100 的文档
# 对于单个查询列,可以省略 $and
db.COLLECTIONS_NAME.find(
{ 'age': { $gt:0, $lt:100 }
)
# 查询 name=zlfan 或者 age=18 的文档
db.COLLECTION_NAME.find(
{ $or: [{ 'name':'zlfan'},{'age':18 }] }
)
查询单条数据,使用findOne()
db.COLLECTION_NAME.findOne(
{ 'name': 'zlfan' }
)
拓展,mongodb 还有一个$type操作符,可以根据键的值类型查询文档,用以多个文档中存在键一样,值类型不同的情况,$type的值使用小写,支持:double、string、object、array、boolean、date等数据类型。
db.COLLECTION_NAME.find(
{ 'name': { $type: 'string'} }
)
删除文档
remove()函数是用来移除集合中的数据。
基础语法
db.COLLECTION_NAME.remove(
<query>,
<justOne>
)
query:(可选)删除的文档的条件,参考上述查询文档的query使用。justOne:(可选)如果设为 true 或 1,则只删除一个文档,如果不设置该参数,或使用默认值 false,则删除所有匹配条件的文档。
db.COLLECTION_NAME.remove({'name':'zlfan'},{'justOne':1})
注:即使删除集合中的所有文档,删除操作也不会删除索引。
deleteOne() 函数
它是官方推荐删除单个文档的方法。该方法只删除满足条件的第一条文档。
deleteMany() 函数
该方法只删除满足条件的所有数据。
# 按条件删除一个文档
db.COLLECTION_NAME.deleteOne({'name':'zlfan'})
# 删除符合条件的多个文档,如果不传参数,删除集合内的所有文档
db.COLLECTION_NAME.deleteMany({'name':'zlfan'})
# deleteAll
db.COLLECTION_NAME.deleteMany({})
更新文档
update()函数
db.COLLECTION_NAME.update(
{ 'name':'zlfan' },
{ $set: { 'name':'fanzl' } },
<options>
)
options可选参数,是一个文档类型
upsert:可选,这个参数的意思是,如果不存在update的记录,是否插入objNew,true为插入,默认是false,不插入。multi:可选,mongodb 默认是false,只更新找到的第一条记录,如果这个参数为true,就把按条件查出来多条记录全部更新。writeConcern:可选,抛出异常的级别。
注:如果不加 $set ,将会替换之前的文档,这意味着旧字段将丢失
官方新的api:updateOne(),updateMany(),replaceOne()
第一个参数为查询条件,第二次参数为要更新的文档
# 将 name 改为 fanzl
db.COLLECTION_NAME.updateOne({'name';'zlfan'},{$set:{'name':'fanzl'}})
# 下面的例子使用库存集合上的db.COLLECTION_NAME.updateMany()方法来更新所有 age 小于50的文档:
db.COLLECTION_NAME.updateMany(
{ 'age': { $lt: 50 } },
{ $set: { 'name': 'fanzl', 'age': 20 } }
)
# replaceOne() 比较特殊,替换文档除了 _id 字段外的所有内容
db.COLLECTION_NAME.replaceOne(
{ item: "paper" },
{ item: "paper", instock: [ { warehouse: "A", qty: 60 }, { warehouse: "B", qty: 40 } ] }
)
小结
操作文档时,尽量使用新的方法,如 insertOne,insertMany 等后缀带有明确意味的方法。
拓展一些方法和操作符
函数
limit():如果你需要在MongoDB中读取指定数量的数据记录,可以使用MongoDB的Limit方法,limit()方法接受一个数字参数,该参数指定从MongoDB中读取的记录条数。
db.COLLECTION_NAME.find().limit(NUMBER)
# NUMBER为显示的记录数
skip():我们除了可以使用limit()方法来读取指定数量的数据外,还可以使用skip()方法来跳过指定数量的数据,skip方法同样接受一个数字参数作为跳过的记录条数。
db.COLLECTION_NAME.find().limit(NUMBER).skip(NUMBER)
count():查询集合内的文档总数
db.COLLECTION_NAME.find().count()
sort():在 MongoDB 中使用 sort() 方法对数据进行排序,sort() 方法可以通过参数指定排序的字段,并使用 1 和 -1 来指定排序的方式,其中 1 为升序排列,而 -1 是用于降序排列。
db.COLLECTION_NAME.find().sort({KEY:1})
操作符
$inc:可以对文档的某个值为数字型(只能为满足要求的数字)的键进行增减的操作。1即加1
db.COLLECTION_NAME.updateOne({'name':'zlfan'},{$inc:{'age':1}})
$unset:主要是用来删除键
db.COLLECTION_NAME.updateOne( {'name':'zlfan'},{$unset:{'age':20}} )
$rename:对键进行重命名
db.COLLECTION_NAME.updateOne({'name':'zlfan'},{$rename:{'name':'username'}})
针对数组类型,有以下四种操作符
$push:向文档某个数组类型的键添加一个数组元素,不过滤重复数据,添加时键存在,要求键值必须是数组;键不存在则创建数组类型的键。
db.COLLECTION_NAME.updateOne({'title':'MongoDB 教程'},{$push:{tags:"mysql"}})
$pop:删除数组元素,1 表示从数组的尾部删除; -1 表示从头部开始删除
db.COLLECTION_NAME.updateOne({'title':'MongoDB 教程'},{$pop:{tags:1}})
$pull:从数组删除满足条件的元素
db.COLLECTION_NAME.updateOne({'title':'MongoDB 教程'},{$pull:{tags:'database'}})
$pullAll:从数组中删除满足条件的多个元素
db.COLLECTION_NAME.updateOne(
{'title':'MongoDB 教程'},
{$pullAll:{'tags':['database','nosql']}}
)
1046

被折叠的 条评论
为什么被折叠?



