MongoDB 3.0 增删改查及聚合操作,pymongo
发布日期:2025-04-14 14:12:20 浏览次数:9 分类:精选文章

本文共 3550 字,大约阅读时间需要 11 分钟。

MongoDB - 增删改查及聚合操作

数据库操作

创建及查看库

在 MongoDB 中,数据库相当于 SQL 中的数据库概念。使用以下命令可以创建或切换到指定数据库:

use DATABASE_NAME

查看当前选择的数据库:

db

查看所有存在的数据库:

show dbs

删除库

要删除一个数据库,首先需要切换到该数据库:

use database_name

然后执行删除命令:

db.dropDatabase()

集合操作

集合相当于 SQL 中的表。以下是基本的增删改查操作。

插入一个文档到集合中:

db.table1.insert({ "name": "alex" })

插入多个文档:

db.table1.insertMany([{ "name": "alex" }, { "name": "wupeiqi" }])

查询集合中的所有文档:

db.table1.find()

按条件查询:

db.table1.find({ "name": "alex" })

删除一个文档:

db.table1.deleteOne({ "name": "alex" })

删除多个符合条件的文档:

db.table1.deleteMany({ "name": "alex" })

删除所有文档:

db.table1.deleteMany({})

更新文档中的字段:

db.table1.update({ "name": "alex" }, { "$set": { "age": 10 } })

使用 $inc 进行加减操作:

db.table1.update({}, { "$inc": { "age": 1 } }, { "multi": true })

文件操作

插入

插入单个文档:

db.table1.insert({ "name": "alex", "age": 10 })

插入多个文档:

db.table1.insertMany([{ "name": "alex" }, { "name": "wupeiqi" }])

删除数组中的元素:

db.table1.deleteOne({ "hobbies": "read" })

使用 $pop 删除数组中的最后一个元素:

db.table1.deleteOne({ "hobbies": 1 })

使用 $pull 删除满足条件的元素:

db.table1.deleteMany({ "addr.country": "China" })

修改

简单修改:

db.table1.update({ "name": "alex" }, { "$set": { "age": 99 } })

加减操作:

db.table1.update({}, { "$inc": { "age": -10 } }, { "multi": true })

聚合操作

$match 和 $group

$match 用于过滤数据,$group 用于聚合数据。

示例:

db.emp.aggregate([  { "$match": { "post": "公务员" } },  { "$group": { "_id": "$post", "avg_salary": { "$avg": "$salary" } } }])

$project

用于投射字段,保留或隐藏字段:

db.emp.aggregate([  { "$project": { "name": 1, "post": 1, "age": 0 } }])

排序和限制

排序:

db.emp.find().sort({ "age": 1 })

分页:

db.emp.find().skip(5).limit(10)

获取数量:

db.table1.count({ "age": { "$gt": 30 } })

实践题

  • 查询岗位名以及各岗位内的员工姓名:
  • db.emp.aggregate([  { "$group": { "_id": "$post", "names": { "$push": "$name" } } }])
    1. 查询岗位名以及各岗位内包含的员工个数:
    2. db.emp.aggregate([  { "$group": { "_id": "$post", "count": { "$sum": 1 } } }])
      1. 查询公司内男员工和女员工的个数:
      2. db.emp.aggregate([  { "$group": { "_id": "$sex", "count": { "$sum": 1 } } }])
        1. 查询岗位名以及各岗位的平均薪资、最高薪资、最低薪资:
        2. db.emp.aggregate([  { "$group": { "_id": "$post", "avg_salary": { "$avg": "$salary" }, "max_salary": { "$max": "$salary" }, "min_salary": { "$min": "$salary" } } }])
          1. 查询男员工与男员工的平均薪资,女员工与女员工的平均薪资:
          2. db.emp.aggregate([  { "$group": { "_id": "$sex", "avg_salary": { "$avg": "$salary" } } }])
            1. 查询各岗位内包含的员工个数小于2的岗位名、岗位内包含员工名字、个数:
            2. db.emp.aggregate([  { "$group": { "_id": "$post", "count": { "$sum": 1 }, "names": { "$push": "$name" } },  { "$match": { "count": { "$lt": 2 } } },  { "$project": { "_id": 0, "names": 1, "count": 1 } }])
              1. 查询各岗位平均薪资大于10000的岗位名、平均工资:
              2. db.emp.aggregate([  { "$group": { "_id": "$post", "avg_salary": { "$avg": "$salary" } },  { "$match": { "avg_salary": { "$gt": 10000 } },  { "$project": { "_id": 1, "avg_salary": 1 } }])
                1. 查询各岗位平均薪资大于10000且小于20000的岗位名、平均工资:
                2. db.emp.aggregate([  { "$group": { "_id": "$post", "avg_salary": { "$avg": "$salary" } },  { "$match": { "avg_salary": { "$gt": 10000, "$lt": 20000 } },  { "$project": { "_id": 1, "avg_salary": 1 } }])
                  1. 查询所有员工信息,先按照age升序排序,如果age相同则按照hire_date降序排序:
                  2. db.emp.aggregate([  { "$sort": { "age": 1, "hire_date": -1 } }])
                    1. 查询各岗位平均薪资大于10000的岗位名、平均工资,结果按平均薪资升序排列:
                    2. db.emp.aggregate([  { "$group": { "_id": "$post", "avg_salary": { "$avg": "$salary" } },  { "$match": { "avg_salary": { "$gt": 10000 } },  { "$sort": { "avg_salary": 1 } }])
                      1. 查询各岗位平均薪资大于10000的岗位名、平均工资,结果按平均薪资降序排列,取前1个:
                      2. db.emp.aggregate([  { "$group": { "_id": "$post", "avg_salary": { "$avg": "$salary" } },  { "$match": { "avg_salary": { "$gt": 10000 } },  { "$sort": { "avg_salary": -1 } },  { "$limit": 1 },  { "$project": { "date": new Date(), "平均工资": "$avg_salary", "_id": 0 } }])
    上一篇:mongoDB 3.0 安全权限访问控制
    下一篇:MongoDB - 索引底层原理和使用,聚合的使用(案例 + 演示)

    发表评论

    最新留言

    感谢大佬
    [***.8.128.20]2025年05月09日 12时28分20秒