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的聚合管道进行过滤操作,并根据各种条件筛选文档。

相关推荐
冰暮流星24 分钟前
flask之app.py讲解
后端·python·flask
程序员契奇1 小时前
Tools工具使用
人工智能·后端
IT_陈寒1 小时前
SpringBoot自动配置没生效?你可能漏了这个注解
前端·人工智能·后端
长明1 小时前
C#项目组织与概念梳理
后端·c#
xn71331 小时前
个人网站站外分发怎么做归因?我给 XBSTACK 补了一套 UTM 追踪规则
后端·低代码
用户2330713074791 小时前
JUC 并发容器与工具
后端
冰暮流星2 小时前
flask之模版渲染
后端·python·flask
威武的花瓣2 小时前
细说ASP.NET的各种异步操作
后端·asp.net·php
漂亮的摩托2 小时前
如何编写一个SpringBoot项目告警推送的Starter
java·spring boot·后端
任性的芝麻2 小时前
ASP.NET MVC 中的异步方式
后端·asp.net·mvc