一. 基本操作
1. 连接数据库
mongodb://username:password@host:port/database
2. 数据库操作
- 创建:
use database_name
- 删除:
db.dropDatabase()
- 查询:
show dbs
3. 集合操作
- 创建:不需要创建集合。当向集合 goods 中插入文档时,如果集合不存在,mongoDB 会自动创建。
- 删除:
db.goods.drop()
- 查询:
show tables
4. 索引操作
-
查询:
db.goods.getIndexes()
-
创建:
db.goods.createIndex({"title":1})
,1 为指定按升序创建索引,如果想按降序来创建索引可指定为 -1 。 -
删除
db.goods.dropIndexes()
:删除全部索引db.goods.dropIndex("title")
:删除指定索引
5. 备份与恢复
5.1 mongodump / mongostore
mongodump 备份文件输出为 bson 格式,可读性差。通常用于创建数据库的完整备份。
-
备份
mongodump -h host --port port -u username -p passward -d database -c collection -q='{query}' -o filepath
-o, --out:备份文件的存放位置
-c, --collection:指定需要备份的集合。如果不指定,则备份数据库中的所有集合。
-q, --query:指定查询条件,只备份符合条件的文档
带权限验证的需要加上 --authenticationDatabase admin
-
恢复
mongostore -h host --port port -u username -p passward -d database -c collection filepath.bson
5.2 mongoexport / mongoimport
mongoexport 备份文件输出为 json 或 csv 格式,可读性强。通常用于使用查询条件导出数据。
-
备份
mongoexport -h host --port port -u username -p passward -d database -c collection -q='{query}' -o filepath
–type:指定文件类型
-f, --fileds:指定要导出哪些列
–limit, --skip, --sort
-
恢复
mongoimport -h host --port port -u username -p passward -d database -c collection --type=json --file filepath.json
二. 文档增删改查
1. 插入文档
-
插入单条数据:insert()
-
插入多条数据:insertMany()
db.goods.inset({ sku: 'K65B141213FNW', shopname: 'fila',source: 'vip', title: '运动鞋', attr: { year: 2021, sex: 'male' }, colors: ['red'], count: 3})
db.goods.insertMany([{ }, { }])
-
save():不指定 _id 字段时的用法类似 insert(),指定 _id 字段则会更新该 _id 的数据。
2. 更新文档
- 语法格式
db.collection.update( <query>, // 查询条件 <update>, // 更新对象和操作符 { multi: <boolean>, // 默认false,只更新查询出的第一条数据。true表示按条件查询的多条记录全部更新。 upsert: <boolean>, // 如果不存在update的条件,是否插入。默认false,不插入。 } )
- 操作符
- $set():修改字段,如果该字段不存在,set 会自动创建后赋值。
db.goods.update({ shopname: 'fila' }, {$set: { source: 'vip'}}, {multi: 1})
- $unset():删除字段
- $inc():对数值字段的值进行增加或减少
db.goods.update({sku: 'K65B141213FNW'}, {$inc: {count: 2}})
- $addToSet:向数组中添加元素,添加时会去重
db.goods.update({sku: 'K65B141213FNW'}}, $addToSet: {colors: 'blue'})
- $pull:删除数组中符合条件的元素
db.goods.update({sku: 'K65B141213FNW'}}, $pull: {colors: 'blue'})
- $rename:重命名字段
db.goods.update({ shopname: 'fila' }, {$rename: {title: 'name'}})
- $set():修改字段,如果该字段不存在,set 会自动创建后赋值。
3. 删除文档
db.goods.remove({sku: 'K65B141213FNW'})
4. 查询文档
4.1 where 条件语句查询
-
and 条件:find 中传入多对 key: value
db.col.find({key1:value1, key2:value2})
-
比较运算符
比较运算符 操作符 = > $gt >= $gte < $lt <= $lte != $ne like $regex db.goods.find({shopname: 'fila', 'count': {$gte: 4}})
db.goods.find({sku: {$regex: '141213'}})
db.goods.find({sku: /141213/})
-
or 条件
db.goods.find({$or: [{shopname: 'fila'}, {brand: 'fila'})
4.2 常用方法
- sort():排序
db.goods.find().sort({created_at: -1})
sort() 方法可以通过参数指定排序的字段,并使用 1 和 -1 来指定排序的方式,其中 1 为升序排列,而 -1 是用于降序排列。 - count():计数
db.goods.find().count()
db.goods.count()
- limit(), skip()
db.goods.find().skip(m).limit(n)
skip() 方法来跳过指定数量的数据;limit() 方法来读取指定数量的数据。 - distinct():返回某个字段的所有不同值
db.goods.distinct('shopname').length
db.goods.distinct('shopname', {detail: false})
4.3 常用操作符
- $in, $nin:字段值在不在给定的数组中
db.goods.find({"source": {$in: ['taobao','tmall']}},{"title": 1, "source": 1})
{“shopname”:1,“title”:1} 表示只显示指定列 - $exist:检查字段是否存在
db.goods.find({"detail": {$exists: false}})
4.4 聚合
db.goods.aggregate(aggregate_operation)
-
聚合表达式
表达式 描述 $sum 求和 $avg 求平均值 $min 对应字段值最小的文档 $max 对应字段值最大的文档 $first 根据文档的排序获取第一条数据 $last 根据文档的排序获取最后一条数据 db.goods.aggregate([{$group: {_id: '$shopname', count: {$sum: 1}}}])
-
聚合管道
-
$match:过滤数据,只输出符合条件的文档。
-
$project:修改输入文档的结构,只输出指定字段。
-
$skip:跳过指定数量的文档,返回其余文档。
-
$limit:用于限制聚合管道返回的文档数。
-
$group:将集合中的文档分组,用于统计结果。
-
$sort:将输入文档排序后输出。
db.goods.aggregate([ { $match: {detail: false} }, { $project: { shopname: 1, time: '$created_at', // 将created_at字段重命名为time url: 1, } }, { $group: { _id: '$shopname', // 使用shopname字段作为分组键(_id) time: { $max: { // 对于每个shopname分组,计算time字段的最大值 $dateToString: { // 聚合管道中的表达式,$dateToString 用于将日期字段转为特定格式的字符串,$dateFromString 将字符串转为日期格式,{ $dateFromString: { dateString: "2017-02-08 12:10:40", format: "%Y-%m-%d %H:%i:%s"} }。 format: "%Y-%m-%d %H:%M:%S", date:"$time", } } }, count: {$sum: 1}, // 对于每个shopname分组,计算每组中的文档数量。{$sum: 1}表示出现一条文档就加1 } }, { $limit: 10 }, { $sort: {count: -1} // 根据count字段的值倒序输出 } ])
-
三. python 操作 mongo
1. 增删改查
import pymongo
mongo_db = pymongo.MongoClient( "mongodb://username:password@host:port/database")
db = mongo_db['database']
- 查询文档
- 查询单条:
result = db.goods.find_one({})
- 查询多条:
result = list(db.goods.find())
- 查询单条:
- 插入文档
- 插入单条:
db.goods.insert_one({})
- 插入多条:
db.goods.insert_many([{}, {}])
- 插入单条:
- 更新文档
- 更新单条:
db.goods.update_one({}, {})
- 更新多条:
db.goods.update_many({}, {})
或db.goods.update({}, {}, multi = True)
- 更新单条:
- 删除文档:
db.goods.remove({})
2. 异步操作
from motor.motor_asyncio import AsyncIOMotorClient
import asyncio
Mongo = AsyncIOMotorClient('mongodb://username:password@host:port/database')
db = Mongo['database']
async def test():
async for item in db.goods.find():
print(item)
await db.goods.update_one({}, {})
asyncio.get_event_loop().run_until_complete(test())