MongoDB学习笔记

本文详细介绍了MongoDB的基本操作,包括连接数据库、数据库和集合操作、索引管理、备份与恢复方法,以及Python(pymongo和Motor)中的增删改查操作,包括异步处理示例。
摘要由CSDN通过智能技术生成

一. 基本操作

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'}})

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())
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值