MongoDB 差異化聚合
Mehvish Ashiq
2023年1月30日
- MongoDB 差異化聚合
-
使用
distinct()
方法在 MongoDB 中查詢不同的值 -
使用
distinct
命令在 MongoDB 中查詢不同的值 -
使用
$group
聚合運算子在 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()
方法從一個集合或檢視中提取指定欄位的不同值,並以陣列的形式返回輸出。
它至少需要一個引數,最多三個引數,其中第一個、第二個和第三個引數分別是 field
、query
和 options
。
field
引數是我們應該為其返回唯一(不同)值的 field
名稱。query
告訴我們需要從中獲取不同值的文件。
雖然 options
引數是可選的,但它是一個指定 options
的文件。使用此方法的人必須牢記以下幾點:
db.collection.distinct()
提供了對distinct
命令的包裝,我們將在下一節中介紹。- 如果指定欄位的值是一個陣列,那麼
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 }
此程式碼示例返回每個 city
的 zipcode
欄位的不同值。閱讀以下幾點以瞭解程式碼中發生了什麼。
$addToSet
不斷向陣列新增值,直到該值已經存在。$addToSet
聚合返回一個陣列,其中包含我們儲存在unique_count
變數中的所有唯一值。- 我們將
city
名稱設為_id
,並使用$group
聚合運算子使用_id
和unique_count
對它們進行分組。 - 接下來,我們使用
$project
來指定欄位的包含/抑制,新增新欄位並重置現有欄位的值。在這裡,我們使用$size
來查詢名為$unique_count
的陣列的大小,並將其儲存到distinct_zipcodes
變數中,該變數進一步顯示在_id
欄位旁邊的螢幕上(參見上面給出的輸出)。
作者: Mehvish Ashiq