MongoDB 文档操作与聚合操作
MongoDB 是一种高性能的 NoSQL 数据库,主要使用文档作为数据存储格式。它提供了丰富的文档操作和聚合功能,可以高效地管理和分析数据。以下是 MongoDB 中常用的文档操作和聚合操作的详细指南。
1. 文档操作
MongoDB 使用 JSON 格式的文档来存储数据,这些文档被组织在集合中。以下是一些基本的文档操作:
插入文档
-
插入单个文档
db.collection.insert_one({"name": "Alice", "age": 30})
解释:
insert_one
方法将一个文档插入到名为collection
的集合中。这个文档包含两个字段name
和age
。如果集合不存在,它会自动创建。 -
插入多个文档
db.collection.insert_many([ {"name": "Bob", "age": 25}, {"name": "Charlie", "age": 35} ])
解释:
insert_many
方法将多个文档插入到集合中。这里插入了两个文档,每个文档都有name
和age
字段。
查询文档
-
查询单个文档
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
操作符用于指定文档的显示字段。这里只显示name
和age
字段,不显示_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
操作符添加新的字段或修改现有字段。这里计算quantity
和price
字段的乘积,并将结果存储在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
允许在查询中使用聚合表达式。这里检查field1
和field2
的和是否大于 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 的文档操作和聚合操作,你可以高效地管理和分析你的数据,满足各种应用需求。