mongodb操作指令

概念

SQL术语/概念MongoDB术语/概念解释/说明
databasedatabase数据库
tablecollection数据库表/集合
rowdocument数据记录行/文档
columnfield数据字段/域
indexindex索引
table joins表连接,MongoDB不支持
primary keyprimary 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不等于
$inin
$ninnot 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']}}
)



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值