MongoDB 差異化聚合

Mehvish Ashiq 2023年1月30日
  1. MongoDB 差異化聚合
  2. 使用 distinct() 方法在 MongoDB 中查詢不同的值
  3. 使用 distinct 命令在 MongoDB 中查詢不同的值
  4. 使用 $group 聚合運算子在 MongoDB 中查詢不同的值
MongoDB 差異化聚合

本文討論了 MongoDB 的獨特聚合。在本教程中,我們將學習不同的方法,我們可以使用這些方法來根據專案要求找到唯一/不同的值。

MongoDB 差異化聚合

我們必須有一個填充的集合來學習 MongoDB 差異化聚合。為此,我們建立了一個名為 collection 的集合,其中包含你可以使用的示例資料。

示例程式碼:

// MongoDB version 5.0.8

//insert documents
> db.collection.insertMany([
    { "_id": 1, "state": "punjab", "city": "lahore", "zipcode" : 94608 },
    { "_id": 2, "state": "punjab", "city": "lahore", "zipcode" : 94608 },
    { "_id": 3, "state": "punjab", "city": "lahore", "zipcode" : 99559 },
    { "_id": 4, "state": "punjab", "city": "lahore", "zipcode" : 99559 },

    { "_id": 5, "state": "punjab", "city": "karachi", "zipcode" : 99523 },
    { "_id": 6, "state": "punjab", "city": "karachi", "zipcode" : 94608 },
    { "_id": 7, "state": "punjab", "city": "karachi", "zipcode" : 99559 },
    { "_id": 8, "state": "punjab", "city": "karachi", "zipcode" : 99545 },

    { "_id": 9, "state": "punjab", "city": "multan", "zipcode" : 99545 },
    { "_id": 10, "state": "punjab", "city": "multan", "zipcode" : 94608 },
    { "_id": 11, "state": "punjab", "city": "multan", "zipcode" : 99559 },
    { "_id": 12, "state": "punjab", "city": "multan", "zipcode" : 99559 }
]);

你還可以執行以下命令來檢視插入的資料。

// MongoDB version 5.0.8

//display documents
> db.collection.find();

使用 distinct() 方法在 MongoDB 中查詢不同的值

示例程式碼 1:

// MongoDB version 5.0.8

// return the distinct values for the `zipcode` field across the collection
> db.collection.distinct( "zipcode");

輸出:

[ 94608, 99523, 99545, 99559 ]

示例程式碼 2:

// MongoDB version 5.0.8

// returns unique `city` names where the `zipcode` is either 99559 or 99545 or both.
> db.collection.distinct( "city", {"zipcode": { $in: [99559,99545]}} );

輸出:

[ "karachi", "lahore", "multan" ]

示例程式碼 3:

// MongoDB version 5.0.8

// use the `.length` property to obtain the size/length of the retrieved unique values
> db.collection.distinct( "city", {"zipcode": { $in: [99559,99545]}} ).length;

輸出:

3

distinct() 方法從一個集合或檢視中提取指定欄位的不同值,並以陣列的形式返回輸出。

它至少需要一個引數,最多三個引數,其中第一個、第二個和第三個引數分別是 fieldqueryoptions

field 引數是我們應該為其返回唯一(不同)值的 field 名稱。query 告訴我們需要從中獲取不同值的文件。

雖然 options 引數是可選的,但它是一個指定 options 的文件。使用此方法的人必須牢記以下幾點:

  1. db.collection.distinct() 提供了對 distinct 命令的包裝,我們將在下一節中介紹。
  2. 如果指定欄位的值是一個陣列,那麼 db.collection.distinct() 會將陣列的每個元素視為一個單獨的值。例如,如果欄位包含其值為 [2, [2], 2],則 db.collection.distinct() 將採用 2[2]2 作為單獨的值。

使用 distinct 命令在 MongoDB 中查詢不同的值

示例程式碼:

// MongoDB version 5.0.8

// find distinct values
> db.runCommand ( { distinct: "collection", key: "zipcode" } );

輸出:

{ "values" : [ 94608, 99523, 99545, 99559 ], "ok" : 1 }

在此程式碼中,我們使用了 distinct 聚合命令,該命令在一個集合中查詢指定欄位的所有不同值。結果,它返回一個文件,其中包含一組不同的值。

它還有一個包含查詢計劃和查詢統計資訊的嵌入式文件。

使用 $group 聚合運算子在 MongoDB 中查詢不同的值

示例程式碼:

// MongoDB version 5.0.8

// find size of distinct values for each `city`
> db.collection.aggregate([
    {
        $group:{
            "_id": "$city",
            "unique_count": {
                $addToSet: "$zipcode"
             }
        }
    },
    {
        $project:{
            "distinct_zipcodes":{
                $size: "$unique_count"
             }
        }
    }
]);

輸出:

{ "_id" : "karachi", "distinct_zipcodes" : 4 }
{ "_id" : "lahore", "distinct_zipcodes" : 2 }
{ "_id" : "multan", "distinct_zipcodes" : 3 }

此程式碼示例返回每個 cityzipcode 欄位的不同值。閱讀以下幾點以瞭解程式碼中發生了什麼。

  1. $addToSet 不斷向陣列新增值,直到該值已經存在。 $addToSet 聚合返回一個陣列,其中包含我們儲存在 unique_count 變數中的所有唯一值。
  2. 我們將 city 名稱設為 _id,並使用 $group 聚合運算子使用 _idunique_count 對它們進行分組。
  3. 接下來,我們使用 $project 來指定欄位的包含/抑制,新增新欄位並重置現有欄位的值。在這裡,我們使用 $size 來查詢名為 $unique_count 的陣列的大小,並將其儲存到 distinct_zipcodes 變數中,該變數進一步顯示在 _id 欄位旁邊的螢幕上(參見上面給出的輸出)。
作者: 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