欢迎光临
我们一直在努力

MongoDB(40)如何使用$match阶段?

在MongoDB中,使用聚合管道进行过滤操作的关键阶段是 $match。该阶段允许你根据指定的条件筛选文档,类似于SQL中的 WHERE 子句。

使用 $match 阶段的基本结构

$match 阶段的结构如下:

{
$match: {
<field1>: <condition1>,
<field2>: <condition2>,
// 其他条件
}
}

代码示例

以下是使用Node.js进行过滤操作的详细示例。首先确保安装了MongoDB的Node.js驱动:

npm install mongodb

插入示例数据

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);

使用 $match 进行过滤

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 之间的订单。
  • 运行这个脚本后,你会得到如下结果(示例输出):

    // 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:

    pip install pymongo

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

    $match 示例进一步深入:

    1. 基本字段匹配

    { $match: { status: "shipped" } }

    这个 $match 将筛选出所有 status 字段等于 “shipped” 的文档。

    2. 使用比较运算符

    { $match: { amount: { $gt: 100 } } }

    这个 $match 将筛选出所有 amount 字段大于 100 的文档。常用的比较运算符包括:

    • $gt:大于
    • $gte:大于或等于
    • $lt:小于
    • $lte:小于或等于
    • $eq:等于
    • $ne:不等于
    3. 逻辑运算符

    { $match: { $or: [ { customerId: 2 }, { amount: { $gte: 100, $lte: 200 } } ] } }

    这个 $match 将筛选出所有 customerId 为 2 或 amount 在 100 到 200 之间的文档。常用的逻辑运算符包括:

    • $and:与
    • $or:或
    • $not:非
    • $nor:都不
    4. 字符串模式匹配

    { $match: { status: { $regex: "^ship", $options: "i" } } }

    这个 $match 将筛选出所有 status 字段以 “ship” 开头的文档,且匹配时不区分大小写。

    赞(0)
    未经允许不得转载:171主机测评 » MongoDB(40)如何使用$match阶段?
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址