文章目录
基础语句
查询语句
查询示例:
db.collection.find(),返回的是游标
db.movies.find({“year”:1975})
查询逻辑运算符
-
$lt:存在并小于
-
$lte:存在并小于等于
-
$gt:存在并大于
-
$gte:存在并大于等于
-
$ne:不存在或存在但不等于
-
$in:存在并在指定数组中
-
$nin:不存在或不在指定数组中
-
$or:匹配条件中的一个
- db.movies.find({$or:[{“title”:“Batman”},{“category”:“action”}]})
-
$and:匹配全部条件
- db.movies.find({$and:[{“title”:“Batman”},{“category”:“action”}]})
- db.movies.find({“title”:“Batman”,“category”:“action”})
搜索子文档
可以使用field.sub_field查询子文档
db.fruit.insertOne({
name: "apple",
from: {
country: "China",
province: "Guangdong"
}
})
- 正确√:db.fruit.find({“from.country” : “China”})
- 查询子文档from.country为china
- 错误×:db.fruit.find({“from”:{country:“China”}})
- 查询文档,其中有from字段,字段的值为country:“China”
搜索数组中的对象
db.fruit.insert([
{"name": "Apple", color: ["red","green"]},
{"name": "Mongo", color: ["yellow","green"]}
])
- db.fruit.find({color : “red”})
- 满足color数组有red的数据
- db.fruit.find({$or: [{color: “red”},{color: “yellow”}]})
- 满足color数组有red或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"}
]
})
- db.movies.find({“filming_locations.city”:“Rome”})
在数组中搜索子对象的多个字段时,若使用**$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返回的字段
- _id字段必须明确指定不返回,否则默认返回
- 在MongoDB成为投影(projection)
- db.movies.find({“category”:“action”},{“_id”:0,“title”:1})
删除语句
db.collection.remove(<查询条件>)
- remove需要配合查询条件使用
- 匹配查询条件的文档会被删除
- 指定一个空文档条件会删除所有文档
删除示例:
db.testcol.remove({a:1})【删除a=1的记录】
db.testcol.remove({a:{$lt:5}})【删除a<5的记录】
db.testcol.remove({})【删除所有记录】
db.testcol.remove()【报错】
更新语句
db.collection.update(<查询条件>,<更新字段>)
- 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【若不存在则增加一个值到数组】
db.fruit.updateOne({name: “apple”},{$set: {from: “China”}})【查询name为apple的记录,将from设为China】
删除集合和数据库
删除Collection
db.collection.drop()
- 集合中全部文档都会被删除
- 集合相关的索引也会被删除
删除Database
db.dropDatabase()
- 数据库相应文件也会被删除,磁盘空间会被释放
使用python连接到MongoDB
python使用MongoDB必须安装数据库的驱动
pip install pymongo
# 检查驱动是否安装
import pymongo
pymongo.version
使用driver连接到MongoDB需指定MongoDB连接字符串,
最简单的形式:mongodb://数据库服务器主机地址:端口号
- mongodb://127.0.0.1:27017
from pymongo import MongoClient
uri = "mongodb://127.0.0.1:27017"
client = MongoClient(uri)
# get db's handler
db=client["eshop"]
# get collection named "users"
user_coll=db["users"]
# insert a new user
new_user={"username":"Tom","password":"ttt","email":"tom@qq.com"}
result=user_coll.insert_one(new_user)
print(result)
# add an attribute for a user
result=user_coll.update_one({"username":"Nina"},{"$set":{"phone":"123456789"}})
print(result)
聚合框架(Aggregation Framework)
- 作用在某个/些集合上
- 对集合中的数据进行一系列运算
- 将数据转为期望的形式
相当于SQL中的:
- GROUP BY
- LEFT OUTER JOIN
- AS
基本格式
pipeline = [$stage1, $stage2, ...$stageN];
db.<COLLECTION>.aggregate(
pipeline,
{options}
);
例:
- SQL查询
SELECT
FIRST_NAME AS '名'
LAST_NAME AS '姓'
FROM Users
WHERE GENDER = '男'
SKIP 100
LIMIT 20
Mongo
deb.users.aggregate([
{$match:{gender:'男'}},
{$skip:100},
{$limit:20},
{
$project:{
'名':'$first_name',
'姓':'$last_name'
}
}
])
步骤
stage | 作用 | SQL等价运算符 |
---|---|---|
$match | 过滤 | WHERE |
$project | 投影 | AS |
$sort | 排序 | ORDER BY |
$group | 分组 | GROUP BY |
s k i p / skip/ skip/limit | 结果限制 | SKIP/LIMIT |
$lookup | 左外连接 | LEFT OUTHER JOIN |
$unwind | 展开数组 | / |
$graphLookup | 图搜索 | / |
f a c e t / facet/ facet/bucket | 分面搜索 | / |