docker下载:docker pull mongo
运行:docker run -itd --name mongo -p 27017:27017 mongo
进入容器并运行mongo命令:docker exec -it mongo mongo
基本操作命令:
插入操作insert
格式:
- db.<集合>.insertOne(<JSON对象>)
- db.<集合>.insertMany<[<JSON 1>,<JSON 2>, ...<JSON N>]> 示例:
- `db.fruit.insertOne({name:"apple"})`
- `db.fruit.insertMany([{name:"apple"},{name:"pear"}, {name:"orange"}])`
查询文档find
find是MongoDB中查询数据的基本指令,相当于SQL中的SELECT find返回的是游标 示例:
- 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/"}) 按正则表达式查找
查询条件对照表:
SQL | MQL
---|---
a = 1 | {a : 1}
a <> 1 (a!=1) | {a: {$ne: 1}}
a > 1 | {a: {$gt: 1}}
a >= 1 | {a: {$gte: 1}}
a < 1 | {a: {$lt: 1}}
a <= 1 | {a: {$lte: 1}}
查询逻辑对照表:
SQL | MQL
---|---
a = 1 AND b = 1 | {a : 1,b: 1} 或 {$and:[{a:1},{b:1}]}
a =1 OR b=1 | {$or: [{a: 1},{b:1}]}
a IS NULL | {a: {$exists: false}}
a IN (1,2,3) | {a: {$in:[1,2,3]}}
查询逻辑运算符:
- $lt :存在并小于
- $lte :存在并小于等于
- $gt :存在并大于
- $gte :存在并大于等于
- $ne :不存在或存在但不等于
- $in : 存在并在指定数组中
- $nin : 不存在或不在指定数组中
- $or : 匹配两个或多个添加中的一个
- $and : 匹配全部条件
使用find搜索子文档
假设现在有一个文档:
db.fruit.insertOne({
name : "apple",
from : {
country : "china",
province : "guanddong"
}
})
当要进行查询from
属性中的country
值为china
时语句应该要怎样写呢?即查询fruit
中的子文档from
时应该怎样查询? 可以使用这样的语句:
db.fruit.find({"from.country":"china"})
使用find搜索数组
- 查询条件在数组中时 文档格式如下:
db.fruit.insert([
{name:"apple",color:["red","green"]},
{name:"pear",color:["yellow","green"]}
])
当要查询颜色为red
语句时可以这样写:db.fruit.find({color:"red"})
当查询条件为多个时,可以这样写:db.fruit.find({$or:[{color:"red"},{color:"yellow"}]})
- 当数组里面为对象时,格式如下:
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"},
]
})
当需要查找城市为Rome
的记录时: db.movies.find({"filming_locations.city":"Rome"})
3. 当查找子数组的多个字段都需要满足条件时,可以使用如下查询。
db.getCollection('movies').find({
"filming_locations.city":"Rome",
"filming_locations.country":"USA"
})
也可使用$elemMatch
来进行匹配查询
db.getCollection('movies').find({
"filming_locations":{
$elemMatch:{"city":"Rome","country":"USA"}
}
})
控制find返回的字段
find({condition},{columns})
- find可以指定返回指定的字段
- _id字段必须明确指明不返还,否则默认返回
- 在MongoDB中称其为投影(projection)
db.movies.find({"category":"action"},{"_id":0,title:1})
这条查询语句中指明不返回id,返回title字段
使用remove删除文档
- remove命令需要配合查询条件使用
- 匹配查询条件的文档会被删除
- 指定一个空文档条件会删除所有文档
实例:
- db.testcol.remove({a:1}) 删除a=1的记录
- db.testcol.remove({a:{$lt:5}}) 删除a<=5的记录
- db.testcol.remove({}) 删除所有记录
- db.testcol.remove() 报错
使用update更新文档
db.<集合>.update(<查询条件>,<更新字段>) 当被更新的字段如果不存在,则创建字段,如果存在则更新 以如下的结构为例:
db.fruit.insertMany([
{name:"apple"},
{name:"pear"},
{name:"orange"}
])
对name=apple
的文档添加属性
db.fruit.updateOne({name:"apple"},{$set:{from:"china"}})
- 使用updateOne()表示无论条件匹配多少条记录,始终只更新第一条
- 使用updateMany表示条件匹配多少条就更新多少条
- updateOne/updateMany方法要求更新条件部分必须有以下之一,否则将报 错:
- $set/$unset
- $push/$pushAll/$pop
- $pull/$pullAll
- $addToSet
更新命令:
- $push 增加一个对象到数组底部
- $pushAll 增加多个对象到数组底部
- $pop 从数组底部删除一个对象
- $pull 如果匹配指定的值,从数组中删除相应的对象
- $pullAll 如果匹配任意的值,从数组中删除相应的对象
- $addToSet 不过不存在则增加一个值到数组
使用drop删除集合
- 使用db.<集合>.drop()来删除一个集合
- 集合中的全部文档都会被删除
- 集合相关的索引也会被删除
db.fruit.drop()
使用dropDatabase删除数据库
- 使用db.dropDatabase()来删除数据库
- 数据库相应文件也会被删除,磁盘空间将被释放
use tempDB
db.dropDatabase()