认识mongo基本操作
MongoDB
MongoDB vs. 关系型数据库
特点
-
快速响应业务变化
- 多形性: 同一个集合中可以包含不同字段(类型)的文档对象
- 动态性: 线上修改数据模式,修改是应用与数据库均无须下线
- 数据治理: 支持使用 JSON Schema 来规范数据模式。在保证模式灵活动态的前提下,提供数据治理能力
-
原生的高可用和横向扩展能力
- Replica Set – 2 to 50 个成员
- 自恢复
- 多中心容灾能力
- 滚动服务 – 最小化服务终端
-
横向扩展能力
- 需要的时候无缝扩展
- 应用全透明
- 多种数据分布策略
- 轻松支持 TB – PB 数量级
-
MongoDB 技术优势总结
- JSON 结构和对象模型接近,开发代码量低
- JSON 的动态模型意味着更容易响应新的业务需求
- 复制集提供 99.999% 高可用
- 分片架构支持海量数据和无缝扩容
增删改查
增加
db.fruit.insertOne({name: "apple"})
db.fruit.insertMany([
{name: "apple"},
{name: "pear"},
{name: "orange"}
])
查找
- 实例
db.movies.find( { "year" : 1975 } ) //单条件查询
db.movies.find( { "year" : 1989, "title" : "Batman" } ) //多条件and查询
db.movies.find( { $and : [ {"title" : "Batman"}, { "category" : "action" }] } ) // and的另一种形式
db.movies.find( { $or: [{"year" : 1989}, {"title" : "Batman"}] } ) //多条件or查询
db.movies.find( { "title" : /^B/} ) //按正则表达式查找
-
查询条件对照表对照表
-
-
查询逻辑对照表
-
-
查询逻辑运算符
● $lt: 存在并小于
● $lte: 存在并小于等于
● $gt: 存在并大于
● $gte: 存在并大于等于
● $ne: 不存在或存在但不等于
● $in: 存在并在指定数组中
● $nin: 不存在或不在指定数组中
● $or: 匹配两个或多个条件中的一个
● $and: 匹配全部条件 -
使用 find 搜索子文档
db.fruit.insertOne({
name: "apple",
from: {
country: "China",
province: "Guangdon" }
})
- 查询子文档应该写入子文档的路径
- db.fruit.find( { “from.country” : “China” } ) //有结果
- db.fruit.find( { “from” : {country: “China”} } ) //无结果返回
- 使用 find 搜索数组
db.fruit.insert([
{ "name" : "Apple", color: ["red", "green" ] },
{ "name" : "Mango", color: ["yellow", "green"] }
])
db.fruit.find({color: "red"})
db.fruit.find({$or: [{color: "red"}, {color: "yellow"}]} )
- 使用 find 搜索数组中的对象1
db.movies.insertOne( {
"title" : "Raiders of the Lost Ark",
"filming_locations" : [
{ "city" : "Los Angeles", "state" : "CA", "country" : "USA" },
{ "city" : "Rome", "state" : "Lazio", "country" : "Italy" },
{ "city" : "Florence", "state" : "SC", "country" : "USA" }]
})
db.movies.find({"filming_locations.city": "Rome"})
- 使用 find 搜索数组中的对象2
- $elemMatch它表示必须是同一个子对象满足多个条件
db.getCollection('movies').find({
"filming_locations.city": "Rome",
"filming_locations.country": "USA"
})
db.getCollection('movies').find({
"filming_locations": {
$elemMatch:{"city":"Rome", "country": "USA"}
}
})
- 控制 find 返回的字段
- find 可以指定只返回指定的字段
- _id字段必须明确指明不返回,否则默认返回
- 在 MongoDB 中我们称这为投影(projection)
- _id不返回,title返回
db.movies.find({"category": "action"},{"_id":0, title:1})
使用 remove 删除文档
- remove 命令需要配合查询条件使用
- 匹配查询条件的的文档会被删除
- 指定一个空文档条件会删除所有文档
- 示例
db.testcol.remove( { a : 1 } ) // 删除a 等于1的记录
db.testcol.remove( { a : { $lt : 5 } } ) // 删除a 小于5的记录
db.testcol.remove( { } ) // 删除所有记录
db.testcol.remove() //报错
使用 update 更新文档
- Update 操作执行格式:db.<集合>.update(<查询条件>, <更新字段>)
db.fruit.insertMany([
{name: "apple"},
{name: "pear"},
{name: "orange"}
])
db.fruit.updateOne({name: "apple"}, {$set: {from: "China"}})
使用 update 更新文档2
- updateOne 表示无论条件匹配多少条记录,始终只更新第一条;
- 使用 updateMany 表示条件匹配多少条就更新多少条;
- updateOne/updateMany 方法要求更新条件部分必须具有以下之一,否则将报错
• s e t / set/ set/unset
• p u s h / push/ push/pushAll/$pop
• p u l l / pull/ pull/pullAll
• $addToSet
使用 update 更新数组
- $push: 增加一个对象到数组底部
- $pushAll: 增加多个对象到数组底部
- $pop: 从数组底部删除一个对象
- $pull: 如果匹配指定的值,从数组中删除相应的对
- $pullAll: 如果匹配任意的值,从数据中删除相应的对象
- $addToSet: 如果不存在则增加一个值到数组
使用 drop 删除集合
- 使用 db.<集合>.drop() 来删除一个集合
- 集合中的全部文档都会被删除
- 集合相关的索引也会被删除
- db.colToBeDropped.drop()
使用 dropDatabase 删除数据库
- 使用 db.dropDatabase() 来删除数据库
- 数据库相应文件也会被删除,磁盘空间将被释放
use tempDB
db.dropDatabase()
show collections // No collections
show dbs // The db is gone