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

相关推荐
ltl1 天前
Transformer 整体架构:一张图看懂
后端
ltl1 天前
Decoder 详解:为什么它天生适合生成
后端
ltl1 天前
Encoder 详解:6 层堆叠到底在做什么
后端
程序员cxuan1 天前
微信读书官方发了 skills,把我给秀麻了。
人工智能·后端·程序员
未若君雅裁1 天前
Spring AOP、日志切面与声明式事务原理
java·后端·spring
zhangxingchao1 天前
AI应用开发六:企业知识库
前端·人工智能·后端
红尘散仙1 天前
一个 `#[uniffi::export]`,把 Rust 接进 React Native
前端·后端·rust
红尘散仙1 天前
一行 `#[specta::specta]`,让 Tauri IPC 有类型
前端·后端·rust
XinZong1 天前
OpenClaw 中最经典的 6 款skill,真正能进工作流的 skills
javascript·后端
zhangxingchao1 天前
AI Agent 基础问题系统整理:从 LangChain、LangGraph、MCP 到 Agent 架构、记忆、工具调用与评估体系
前端·人工智能·后端