MongoDB 文档操作与聚合操作

MongoDB 文档操作与聚合操作

MongoDB 是一种高性能的 NoSQL 数据库,主要使用文档作为数据存储格式。它提供了丰富的文档操作和聚合功能,可以高效地管理和分析数据。以下是 MongoDB 中常用的文档操作和聚合操作的详细指南。

1. 文档操作

MongoDB 使用 JSON 格式的文档来存储数据,这些文档被组织在集合中。以下是一些基本的文档操作:

插入文档
  • 插入单个文档

    db.collection.insert_one({"name": "Alice", "age": 30})
    

    解释: insert_one 方法将一个文档插入到名为 collection 的集合中。这个文档包含两个字段 nameage。如果集合不存在,它会自动创建。

  • 插入多个文档

    db.collection.insert_many([
        {"name": "Bob", "age": 25},
        {"name": "Charlie", "age": 35}
    ])
    

    解释: insert_many 方法将多个文档插入到集合中。这里插入了两个文档,每个文档都有 nameage 字段。

查询文档
  • 查询单个文档

    document = db.collection.find_one({"name": "Alice"})
    

    解释: find_one 方法根据查询条件 { "name": "Alice" } 查找并返回集合中的第一个匹配文档。如果没有找到匹配的文档,它会返回 None

  • 查询多个文档

    documents = db.collection.find({"age": {"$gt": 30}})
    for doc in documents:
        print(doc)
    

    解释: find 方法返回一个游标,遍历集合中所有满足条件 { "age": { "$gt": 30 } } 的文档。这意味着我们在寻找 age 大于 30 的文档。

更新文档
  • 更新单个文档

    db.collection.update_one(
        {"name": "Alice"},
        {"$set": {"age": 31}}
    )
    

    解释: update_one 方法更新集合中第一个匹配条件 { "name": "Alice" } 的文档。使用 $set 运算符将 age 字段的值更新为 31。如果文档中 age 字段不存在,它将创建该字段。

  • 更新多个文档

    db.collection.update_many(
        {"age": {"$lt": 30}},
        {"$set": {"status": "young"}}
    )
    

    解释: update_many 方法更新所有满足条件 { "age": { "$lt": 30 } } 的文档。使用 $set 运算符将 status 字段的值更新为 young

删除文档
  • 删除单个文档

    db.collection.delete_one({"name": "Alice"})
    

    解释: delete_one 方法删除集合中第一个匹配条件 { "name": "Alice" } 的文档。如果没有匹配的文档,则不进行任何操作。

  • 删除多个文档

    db.collection.delete_many({"age": {"$lt": 30}})
    

    解释: delete_many 方法删除所有满足条件 { "age": { "$lt": 30 } } 的文档。


2. 聚合操作

MongoDB 的聚合框架允许对数据执行复杂的分析和处理操作。主要的聚合操作符包括 $match$group$sort$project$limit$skip$unwind$lookup$addFields$replaceRoot$merge等。

基本聚合操作

  • $match

    db.collection.aggregate([
        {"$match": {"age": {"$gt": 30}}}
    ])
    

    解释: $match 操作符过滤集合中的文档,只保留 age 字段值大于 30 的文档。这相当于 SQL 的 WHERE 子句。

  • $group

    db.collection.aggregate([
        {"$group": {"_id": "$age", "count": {"$sum": 1}}}
    ])
    

    解释: $group 操作符将文档按 age 字段分组。每个组中的文档数量通过 $sum 计算,并命名为 count_id 字段设置为分组的 age 值。

  • $sort

    db.collection.aggregate([
        {"$sort": {"age": -1}}  # 降序排列
    ])
    

    解释: $sort 操作符按照 age 字段降序排列文档。-1 表示降序,1 表示升序。

  • $project

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

    解释: $project 操作符用于指定文档的显示字段。这里只显示 nameage 字段,不显示 _id 字段(_id 设置为 0 表示排除)。

  • $limit

    db.collection.aggregate([
        {"$limit": 5}
    ])
    

    解释: $limit 操作符限制返回的文档数量,这里限制为返回前 5 个文档。

  • $skip

    db.collection.aggregate([
        {"$skip": 10}
    ])
    

    解释: $skip 操作符跳过指定数量的文档,这里跳过前 10 个文档。

  • $unwind

    db.collection.aggregate([
        {"$unwind": "$items"}
    ])
    

    解释: $unwind 操作符将 items 数组字段中的每个元素拆分成单独的文档。每个文档包含数组中的一个元素。

  • $lookup

    db.collection.aggregate([
        {
            "$lookup": {
                "from": "orders",
                "localField": "customer_id",
                "foreignField": "customer_id",
                "as": "orders"
            }
        }
    ])
    

    解释: $lookup 操作符用于联接两个集合。将 orders 集合中 customer_id 字段匹配的文档嵌入到当前集合中,并将结果存储在 orders 字段中。

  • $addFields

    db.collection.aggregate([
        {"$addFields": {"totalPrice": {"$multiply": ["$quantity", "$price"]}}}
    ])
    

    解释: $addFields 操作符添加新的字段或修改现有字段。这里计算 quantityprice 字段的乘积,并将结果存储在 totalPrice 字段中。

  • $replaceRoot

    db.collection.aggregate([
        {"$replaceRoot": {"newRoot": "$customer"}}
    ])
    

    解释: $replaceRoot 操作符将当前文档替换为指定的 customer 字段的内容。

  • $merge

    db.collection.aggregate([
        {"$group": {"_id": "$category", "total": {"$sum": "$amount"}}},
        {"$merge": {"into": "category_totals"}}
    ])
    

    解释: $merge 操作符将聚合结果写入到指定的集合 category_totals 中。

其他常用 $ 运算符

  • $expr

    db.collection.find(
        {"$expr": {"$gt": [{"$add": ["$field1", "$field2"]}, 10]}}
    )
    

    解释: $expr 允许在查询中使用聚合表达式。这里检查 field1field2 的和是否大于 10。

  • $type

    db.collection.find({"field": {"$type": "string"}})
    

    解释: $type 返回字段的数据类型。这里查找所有 field 字段数据类型为字符串的文档。

  • $exists

    db.collection.find({"field": {"$exists": True}})
    

    解释: $exists 检查字段是否存在。这里查找所有包含 field 字段的文档。

  • $ifNull

    db.collection.aggregate([
        {"$project": {"field": {"$ifNull": ["$field", "default_value"]}}}
    ])
    

    解释: $ifNull 如果字段值为 null 或不存在,则返回指定的替代值。这里将 field 字段为 null 或不存在的文档中的 field 设置为 default_value


通过了解这些 MongoDB 的文档操作和聚合操作,你可以高效地管理和分析你的数据,满足各种应用需求。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值