MongoDB Shell 安装及增删改
centos7 安装mongoDB shell
wget https://downloads.mongodb.com/compass/mongodb-mongosh-1.10.1.x86_64.rpm
rpm -ivh mongodb-mongosh-1.10.1.x86_64.rpm
连接
mongosh --port 27017
创建数据库
use mytest
如果数据库不存在,则自动创建数据库,否则切换到指定数据库
提示
如果是新数据库,运行show dbs
是看不到的,必须插入一条数据,才能看到
查看数据库
show dbs
删除数据库
# 切换到要删除的数据库
use mytest
db.dropDatabase()
# 输出结果
{ ok: 1, dropped: 'mytest' }
创建集合
语法格式:
db.createCollection(name,options)
name: 要创建的集合名称
options: 可选参数,指定有关内存大小及索引的选项
options可选参数列表
字段 | 类型 | 描述 |
---|---|---|
capped | 布尔 | (可选)如果为 true,则创建固定集合。固定集合是指有着固定大小的集合,当达到最大值时,它会自动覆盖最早的文档。 当该值为 true 时,必须指定 size 参数。 |
autoIndexId | 布尔 | 3.2 之后不再支持该参数。(可选)如为 true,自动在 _id 字段创建索引。默认为 false。 |
size | 数值 | (可选)为固定集合指定一个最大值,即字节数。如果 capped 为 true,也需要指定该字段。 |
max | 数值 | (可选)指定固定集合中包含文档的最大数量。 |
在插入文档时,MongoDB 首先检查固定集合的 size 字段,然后检查 max 字段。
举个例子
use mytest
# 创建集合 (不带参数)
db.createCollection("zcg")
# 查看已有集合
show collections 或 show tables
# 创建固定集合 mycol,整个集合空间大小 6142800 B, 文档最大个数为 10000 个
db.createCollection("mycol",{capped:true,autoIndexId:true,size:6142800,max:10000})
在 MongoDB 中,你不需要创建集合。当你插入一些文档时,MongoDB 会自动创建集合
删除集合
语法格式:
db.collection.drop()
如果删除成功,则drop()方法返回true,否则返回false
举个例子:
在数据库mytest中,运行show collections
查看集合
删除mycol2集合
db.mycol2.drop()
插入文档
所有存储到集合中的数据都是BSON格式
BSON是一种类似JSON的二进制形式的存储格式,是Binary JSON的简称
MongoDB 使用insert()、save()、insertOne()、insertMany() 方法向集合中插入文档,格式如下:
db.collection_name.insert(document)
或
db.collection_name.save(document)
或
db.collection_name.insertOne(document)
或
db.collection_name.insertMany(document)
save()
提示
新版本中已废弃
如果_id
主键存在则更新数据,如果不存在就插入数据,该方法在新版本中已废弃,可以使用db.collection.insertOne() 或 db.collection.replaceOne() 代替
insert()
若插入的主键已存在,则会抛 org.springframework.dao.DuplicateKeyException
异常,提示主键重复,不存在则插入数据
insertOne()
插入单个文档,语法格式如下:
db.collection.insertOne(
<document>,
{
writeConcern: <document>
}
)
参数说明:
- document 要写入的文档
- writeConcern:写入策略,默认为 1,即要求确认写操作,0 是不要求。
- ordered:指定是否按顺序写入,默认 true,按顺序写入。
insertMany()
插入多个文档,语法格式如下:
db.collection.insertMany(
[ <document 1> , <document 2>, ... ],
{
writeConcern: <document>,
ordered: <boolean>
}
)
参数说明:
- document 要写入的文档
- writeConcern:写入策略,默认为 1,即要求确认写操作,0 是不要求。
- ordered:指定是否按顺序写入,默认 true,按顺序写入。
实例
使用insert()方法插入:
db.mytest.insert({"name":"王五"})
使用insertOne()方法插入
db.mytest.insertOne({"name":"张三"})
使用insertMany()方法插入
db.mytest.insertMany([{name:'老六'},{name:'老七',age:32}])
定义为变量document,然后再执行插入
document=({name:'老八'})
db.mytest.insert(document)
更新文档
使用update()、save()、updateOne()、updateMany() 方法更新文档,update()和save()方法在新版本中已废弃,使用updateOne()、updateMany()代替
update()
提示
新版本中已废弃
用于更新与存在的文档,语法格式如下:
db.collection.update(
<query>,
<update>,
{
upsert: <boolean>,
multi: <boolean>,
writeConcern: <document>
}
)
参数说明:
- query: update的查询条件,类似sql update查询内where后面的。
- update: update的对象和一些更新的操作符(如inc...)等,也可以理解为sql update查询内set后面的
- upsert: 可选,这个参数的意思是,如果不存在update的记录,是否插入objNew,true为插入,默认是false,不插入。
- multi: 可选,mongodb 默认是false,只更新找到的第一条记录,如果这个参数为true,就把按条件查出来多条记录全部更新。
- writeConcern: 可选,抛出异常的级别。
更新实例
更新前面插入的例子,更新name=张三,改为name=张三丰
使用update()更新
db.mytest.update({name:'张三'},{$set:{name:'张三丰'}})
使用save()更新
db.mytest.find()
[
{ _id: ObjectId("649ba47d4d4ff6e3018ffe1b"), name: '李四' },
{ _id: ObjectId("649ba6d14d4ff6e3018ffe1c"), name: '老六' },
{ _id: ObjectId("649ba6d14d4ff6e3018ffe1d"), name: '老七', age: 32 },
{ _id: ObjectId("649ba75c4d4ff6e3018ffe1e"), name: '老八' }
]
# 将_id为649ba47d4d4ff6e3018ffe1b的文档数据更新
db.mytest.save({"_id": ObjectId("649ba47d4d4ff6e3018ffe1b"),"name":"李四一"})
使用updateOne()更新
db.mytest.updateOne({"_id": ObjectId("649ba47d4d4ff6e3018ffe1b")},{$set: {"name":"李四一"}})
使用updateMany()更新,更新多个
将name=张三的数据都更新为name=张三丰
db.mytest.updateMany({name:"张三"},{$set: {name:"张三丰"}})
删除文档
使用remove()、deleteOne()、deleteMany()、findOneAndDelete()、bulkWrite()删除文档
remove()
提示
新版本中已废弃
db.mytest.remove({_id: ObjectId("649ba0144d4ff6e3018ffe1a")})
deleteOne()
语法:
db.collection.deleteOne(filter,options)
举例:
db.mytest.deleteOne({_id: ObjectId("649bae674d4ff6e3018ffe1f")})
deleteMany()
语法:
db.collection.deleteMany(filter,options)
举例:
删除name里包含"老"字开头的所有文档
db.mytest.deleteMany({"name":{$regex: /^老/}})
findOneAndDelete()
根据过滤器和排序条件从集合中删除单个文档,并返回删除的文档
语法:
db.Collection_name.findOneAndDelete(
Selection_criteria,
{
projection:<document>,
sort:<document>,
maxTimeMS:<number>,
collation:<document>
}
)
参数:
- 第一个参数是选择标准。此参数的类型是文档。
- 第二个参数是可选的
可选参数:
- projection:它允许您仅选择必要的数据,而不是从文档中选择整个数据。
- sort:它指定与选择标准匹配的文档的排序顺序。值1按升序排序,-1则按降序排序。
- maxTimeMs:这是允许查询运行的最长时间。
- collation:它指定使用归类进行操作。它允许用户为字符串比较指定language-specific规则,例如字母大写和重音符号规则。此参数的类型是文档。
返回:
- 如果文档与给定的过滤器查询匹配,则此方法返回已删除的文档。
- 如果没有文档与给定的过滤器查询匹配,则此方法返回null。
举例:
根据选择标准查找和删除第一个文档
db.mytest.findOneAndDelete({"name":"李四一"})
根据选择条件查找和删除文档,按照年龄字段对文档进行降序排序,然后删除年龄为32岁的第一个文档
db.mytest.findOneAndDelete({"age":32}, {sort:{age:-1}})
批量操作bulkWrite()
语法:
db.collection.bulkWrite(
[ <operation 1>, <operation 2>, ... ],
{
writeConcern : <document>,
ordered : <boolean>
}
)
参数:
- operations
array
bulkWrite() 写操作的数组。支持操作:insertOne、updateOne、updateMany、deleteOne、deleteMany、replaceOne - writeConcern
document
可选, write concern 文档,省略则使用默认的 write concern。 - ordered
boolean
可选,表示mongod实例有序还是无序执行操作。默认值true。
返回:
- 操作基于 write concern 运行则 acknowledged 值为true,如果禁用 write concern 运行则 acknowledged 值为false。
- 每一个写操作数
- 成功 inserted 或 upserted文档的 _id 的组数
批量操作实例
db.mytest.bulkWrite(
[
{
insertOne: {
"document": {
"_id": 4, "char": "Dithras", "class": "barbarian", "lvl": 4
}
}
},
{
insertOne: {
"document": {
"_id": 5, "char": "Taeln", "class": "fighter", "lvl": 3
}
}
},
{
updateOne:{
"filter": { "char": "Eldon" },
"update": { $set: { "status": "Critical Injury" } }
}
},
{
deleteOne: { "filter": { "char": "Brisbane"} }
},
{
replaceOne:{
"filter": { "char": "Meldane" },
"replacement": { "char": "Tanys", "class": "oracle", "lvl": 4 }
}
}
]
);
默认情况下 ordered 为 true, 顺序执行时遇到错误就停止执行(后续的操作不会被执行)
查询文档
由于篇幅限制,查询另外开一个新的文档记录 传送门