MongoDB 陣列聚合匹配

Mehvish Ashiq 2024年2月16日
  1. MongoDB 陣列中的聚合匹配
  2. 使用 $match$in 在 MongoDB 的陣列中查詢匹配的文件
  3. 在 MongoDB 中使用 $match$eq 來尋找陣列中的匹配文件
  4. 在 MongoDB 中使用 $match$all 來查詢陣列中的匹配檔案
MongoDB 陣列聚合匹配

本文通過程式碼示例介紹瞭如何在陣列中使用 MongoDB 聚合匹配。我們將探索使用字串型別陣列和數值型別陣列的不同示例。

MongoDB 陣列中的聚合匹配

我們已經學會了將匹配聚合階段與比較運算子、$and/$or 運算子和 $group/$project 階段一起使用。你可以在這裡找到那篇文章。

在這裡,我們專注於學習陣列中的 MongoDB 聚合匹配以找到匹配的文件。建立一個集合,其中至少一個欄位包含一個陣列。

你可以利用以下命令跟隨我們。

示例程式碼:

db.createCollection('student_courses');
db.student_courses.insertMany([
    {"_id": "ma01", courses: ['Java', 'Python', 'Databases'], results: [3,5]},
    {"_id": "sd02", courses: ['Java', 'Python'], results: [6,3]},
    {"_id": "gh03", courses: ['JavaScript', 'Angular'], results: [8,9]},
    {"_id": "rt04", courses: ['Data Science', 'Python'], results: [2,5]}
]);
db.student_courses.find();

輸出:

{ "_id" : "ma01", "courses" : [ "Java", "Python", "Databases" ], "results" : [ 3, 5 ] }
{ "_id" : "sd02", "courses" : [ "Java", "Python" ], "results" : [ 6, 3 ] }
{ "_id" : "gh03", "courses" : [ "JavaScript", "Angular" ], "results" : [ 8, 9 ] }
{ "_id" : "rt04", "courses" : [ "Data Science", "Python" ], "results" : [ 2, 5 ] }

使用 $match$in 在 MongoDB 的陣列中查詢匹配的文件

示例程式碼:

db.student_courses.aggregate({
    $match:{
        $expr:{ $in: ['Java', "$courses"]}
    }
});

輸出:

{ "_id" : "ma01", "courses" : [ "Java", "Python", "Databases" ], "results" : [ 3, 5 ] }
{ "_id" : "sd02", "courses" : [ "Java", "Python" ], "results" : [ 6, 3 ] }

此程式碼片段使用 $match$expr 讓我們在查詢語言中使用聚合表示式。在這裡,$expr 構建了查詢表示式,用於比較 $match 階段中確切文件的欄位。

此外,$in 運算子選擇 courses 陣列包含 Java 作為陣列元素的那些文件。要檢查指定陣列中的多個值,請按以下方式使用查詢。

示例程式碼:

db.student_courses.aggregate({
    $match:{
        courses:{ $in: ['Java', 'Python']}
    }
});

輸出:

{ "_id" : "ma01", "courses" : [ "Java", "Python", "Databases" ], "results" : [ 3, 5 ] }
{ "_id" : "sd02", "courses" : [ "Java", "Python" ], "results" : [ 6, 3 ] }
{ "_id" : "rt04", "courses" : [ "Data Science", "Python" ], "results" : [ 2, 5 ] }

這個例子只選擇那些 courses 陣列包含 JavaPython (或兩者兼有) 的文件。同樣,我們可以使用數值陣列。

示例程式碼:

db.student_courses.aggregate({
    $match:{
        results:{ $in: [3,6]}
    }
});

輸出:

{ "_id" : "ma01", "courses" : [ "Java", "Python", "Databases" ], "results" : [ 3, 5 ] }
{ "_id" : "sd02", "courses" : [ "Java", "Python" ], "results" : [ 6, 3 ] }

這個查詢只檢索那些 results 陣列包含 36(或兩者)的文件。

示例程式碼:

db.student_courses.aggregate({
    $match:{
       $expr:{ $gt: [{$sum: "$results"}, 10]}
    }
});

輸出:

{ "_id" : "gh03", "courses" : [ "JavaScript", "Angular" ], "results" : [ 8, 9 ] }

在這裡,我們只選擇那些 results 陣列的所有元素之和大於 10 的文件。

在 MongoDB 中使用 $match$eq 來尋找陣列中的匹配文件

示例程式碼:

db.student_courses.aggregate({
    $match:{
        courses:{ $eq: ['Java', 'Python']}
    }
});

輸出:

{ "_id" : "sd02", "courses" : [ "Java", "Python" ], "results" : [ 6, 3 ] }

在這裡,我們使用 $eq 運算子僅獲取那些 courses 陣列包含我們使用 $eq 運算子指定的確切陣列的元素。

在 MongoDB 中使用 $match$all 來查詢陣列中的匹配檔案

示例程式碼:

db.student_courses.aggregate({
    $match:{
        courses:{ $all: ['Java', 'Python']}
    }
});

輸出:

{ "_id" : "ma01", "courses" : [ "Java", "Python", "Databases" ], "results" : [ 3, 5 ] }
{ "_id" : "sd02", "courses" : [ "Java", "Python" ], "results" : [ 6, 3 ] }

$all 等價於 $and 運算子。此程式碼檢索所有那些 courses 陣列包含 $all 運算子的所有指定元素的文件。

生成的文件必須包含 JavaPython 元素。

作者: Mehvish Ashiq
Mehvish Ashiq avatar Mehvish Ashiq avatar

Mehvish Ashiq is a former Java Programmer and a Data Science enthusiast who leverages her expertise to help others to learn and grow by creating interesting, useful, and reader-friendly content in Computer Programming, Data Science, and Technology.

LinkedIn GitHub Facebook

相關文章 - MongoDB Match