在MongoDB中,使用聚合管道进行过滤操作的关键阶段是 $match。该阶段允许你根据指定的条件筛选文档,类似于SQL中的 WHERE 子句。
使用 $match 阶段进行过滤
$match 阶段的基本结构如下:
javascript
{
$match: {
<field1>: <condition1>,
<field2>: <condition2>,
// 其他条件
}
}
代码示例
以下是使用Node.js进行过滤操作的详细示例。首先确保安装了MongoDB的Node.js驱动:
bash
npm install mongodb
插入示例数据
javascript
const { MongoClient } = require('mongodb');
async function insertData() {
const uri = "mongodb://localhost:27017";
const client = new MongoClient(uri, { useUnifiedTopology: true });
try {
await client.connect();
const db = client.db('myDatabase');
const collection = db.collection('orders');
await collection.deleteMany({}); // 清空集合
await collection.insertMany([
{ customerId: 1, amount: 100, status: "shipped" },
{ customerId: 1, amount: 200, status: "pending" },
{ customerId: 2, amount: 150, status: "shipped" },
{ customerId: 2, amount: 50, status: "pending" },
{ customerId: 3, amount: 250, status: "shipped" }
]);
console.log("Data inserted");
} finally {
await client.close();
}
}
insertData().catch(console.error);
使用聚合管道进行过滤
javascript
async function aggregateData() {
const uri = "mongodb://localhost:27017";
const client = new MongoClient(uri, { useUnifiedTopology: true });
try {
await client.connect();
const db = client.db('myDatabase');
const collection = db.collection('orders');
// 使用 $match 进行过滤,筛选出 amount 大于 100 的订单
console.log("\n$match stage (amount > 100):");
let result = await collection.aggregate([
{ $match: { amount: { $gt: 100 } } } // 过滤出 amount 大于 100 的订单
]).toArray();
console.log(result);
// 使用 $match 进行过滤,筛选出状态为 shipped 且 amount 小于 200 的订单
console.log("\n$match stage (status = shipped and amount < 200):");
result = await collection.aggregate([
{ $match: { status: "shipped", amount: { $lt: 200 } } } // 过滤出 status 为 shipped 且 amount 小于 200 的订单
]).toArray();
console.log(result);
// 使用 $match 进行过滤,筛选出 customerId 为 2 或 amount 在 100 到 200 之间的订单
console.log("\n$match stage (customerId = 2 or amount between 100 and 200):");
result = await collection.aggregate([
{ $match: { $or: [ { customerId: 2 }, { amount: { $gte: 100, $lte: 200 } } ] } } // 过滤出 customerId 为 2 或 amount 在 100 到 200 之间的订单
]).toArray();
console.log(result);
} finally {
await client.close();
}
}
aggregateData().catch(console.error);
在这个示例中,我们演示了如何使用 $match 阶段进行过滤操作:
- 筛选出
amount大于 100 的订单。 - 筛选出
status为shipped且amount小于 200 的订单。 - 筛选出
customerId为 2 或amount在 100 到 200 之间的订单。
运行这个脚本后,你会得到如下结果(示例输出):
javascript
// amount > 100 结果
$match stage (amount > 100):
[
{ customerId: 1, amount: 200, status: 'pending' },
{ customerId: 2, amount: 150, status: 'shipped' },
{ customerId: 3, amount: 250, status: 'shipped' }
]
// status = shipped and amount < 200 结果
$match stage (status = shipped and amount < 200):
[
{ customerId: 1, amount: 100, status: 'shipped' },
{ customerId: 2, amount: 150, status: 'shipped' }
]
// customerId = 2 or amount between 100 and 200 结果
$match stage (customerId = 2 or amount between 100 and 200):
[
{ customerId: 1, amount: 100, status: 'shipped' },
{ customerId: 1, amount: 200, status: 'pending' },
{ customerId: 2, amount: 150, status: 'shipped' },
{ customerId: 2, amount: 50, status: 'pending' }
]
其他语言示例
类似的过滤操作也可以在其他编程语言中实现,如Python。以下是Python的示例代码:
安装PyMongo
在终端中运行以下命令来安装PyMongo:
bash
pip install pymongo
使用Python进行过滤
python
from pymongo import MongoClient
def main():
client = MongoClient('mongodb://localhost:27017/')
db = client['myDatabase']
collection = db['orders']
# 使用 $match 进行过滤,筛选出 amount 大于 100 的订单
print("\n$match stage (amount > 100):")
pipeline = [
{ '$match': { 'amount': { '$gt': 100 } } } # 过滤出 amount 大于 100 的订单
]
result = list(collection.aggregate(pipeline))
for doc in result:
print(doc)
# 使用 $match 进行过滤,筛选出 status 为 shipped 且 amount 小于 200 的订单
print("\n$match stage (status = shipped and amount < 200):")
pipeline = [
{ '$match': { 'status': "shipped", 'amount': { '$lt': 200 } } } # 过滤出 status 为 shipped 且 amount 小于 200 的订单
]
result = list(collection.aggregate(pipeline))
for doc in result:
print(doc)
# 使用 $match 进行过滤,筛选出 customerId 为 2 或 amount 在 100 到 200 之间的订单
print("\n$match stage (customerId = 2 or amount between 100 and 200):")
pipeline = [
{ '$match': { '$or': [ { 'customerId': 2 }, { 'amount': { '$gte': 100, '$lte': 200 } } ] } } # 过滤出 customerId 为 2 或 amount 在 100 到 200 之间的订单
]
result = list(collection.aggregate(pipeline))
for doc in result:
print(doc)
if __name__ == '__main__':
main()
运行这个脚本后,你会得到类似的结果。通过这些示例,你可以了解到如何在不同编程语言中使用MongoDB的聚合管道进行过滤操作,并根据各种条件筛选文档。