MongoDB(39)如何使用聚合进行过滤?

在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 阶段进行过滤操作:

  1. 筛选出 amount 大于 100 的订单
  2. 筛选出 statusshippedamount 小于 200 的订单
  3. 筛选出 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的聚合管道进行过滤操作,并根据各种条件筛选文档。

相关推荐
Victor3562 小时前
MongoDB(38)如何使用聚合进行投影?
后端
AI_56782 小时前
基于智优达平台的Python教学实践:从环境搭建到自动评测
开发语言·前端·人工智能·后端·python
IT_陈寒2 小时前
JavaScript开发者必备的5个高效调试技巧,90%的人都不知道最后一个!
前端·人工智能·后端
会编程的土豆3 小时前
Set 深度解析:去重、唯一性与你的智能抽屉
java·开发语言·后端·数据结构与算法
颜酱3 小时前
二分图核心原理与判定算法
javascript·后端·算法
奋斗小强3 小时前
前端工程化:从 Webpack 到 Vite,打包速度提升 10 倍的秘密
后端
我叫黑大帅3 小时前
Golang中实时推送的功臣 - WebSocket
后端·面试·go
朱雨鹏3 小时前
图解RocketMQ运行原理
后端·rocketmq
颜颜颜yan_3 小时前
从千毫秒到亚毫秒:连接条件下推如何让复杂 SQL 飞起来
后端