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") :删除指定索引

二. 文档增删改查

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())

相关推荐

  1. MongoDB学习笔记

    2024-03-13 15:48:02       42 阅读
  2. MongoDB学习笔记

    2024-03-13 15:48:02       29 阅读
  3. 学习mongoDB

    2024-03-13 15:48:02       53 阅读
  4. Mongodb学习

    2024-03-13 15:48:02       29 阅读
  5. MongoDB使用笔记

    2024-03-13 15:48:02       38 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-03-13 15:48:02       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-03-13 15:48:02       106 阅读
  3. 在Django里面运行非项目文件

    2024-03-13 15:48:02       87 阅读
  4. Python语言-面向对象

    2024-03-13 15:48:02       96 阅读

热门阅读

  1. 【项目实践】Pyside6+Qtdesigner:登录窗体设计

    2024-03-13 15:48:02       38 阅读
  2. SQL 中避免使用 != 或 <>

    2024-03-13 15:48:02       39 阅读
  3. unityAB包管理(远程下载)

    2024-03-13 15:48:02       37 阅读
  4. 【蓝桥杯】分糖果

    2024-03-13 15:48:02       42 阅读
  5. 前端框架发展史

    2024-03-13 15:48:02       41 阅读
  6. 线上事故,到底该谁担责?

    2024-03-13 15:48:02       39 阅读
  7. Grafana

    Grafana

    2024-03-13 15:48:02      42 阅读