MongoDB学习笔记

一. 基本操作

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. 更新文档

  • 语法格式

    json 复制代码
    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'}})`

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:将输入文档排序后输出。

      json 复制代码
      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. 增删改查

python 复制代码
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. 异步操作

py 复制代码
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())
相关推荐
老邓计算机毕设18 分钟前
SSM智慧社区家政服务系统80q7o(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面
数据库·ssm 框架
松涛和鸣1 小时前
72、IMX6ULL驱动实战:设备树(DTS/DTB)+ GPIO子系统+Platform总线
linux·服务器·arm开发·数据库·单片机
likangbinlxa1 小时前
【Oracle11g SQL详解】UPDATE 和 DELETE 操作的正确使用
数据库·sql
r i c k2 小时前
数据库系统学习笔记
数据库·笔记·学习
野犬寒鸦2 小时前
从零起步学习JVM || 第一章:类加载器与双亲委派机制模型详解
java·jvm·数据库·后端·学习
IvorySQL3 小时前
PostgreSQL 分区表的 ALTER TABLE 语句执行机制解析
数据库·postgresql·开源
·云扬·3 小时前
MySQL 8.0 Redo Log 归档与禁用实战指南
android·数据库·mysql
IT邦德3 小时前
Oracle 26ai DataGuard 搭建(RAC到单机)
数据库·oracle
惊讶的猫4 小时前
redis分片集群
数据库·redis·缓存·分片集群·海量数据存储·高并发写
不爱缺氧i4 小时前
完全卸载MariaDB
数据库·mariadb