我只有 2 年的 SQL 資料庫經驗和 0 年的 noSQL 資料庫。我正在嘗試使用執行查找、分組、求和和排序的 mongoDB 指南針聚合管道工具撰寫管道。我正在使用 MongoDB 指南針來嘗試完成此操作。另外,請分享任何使學習變得更容易的資源,我不太喜歡使用指南針在線找到好的且易于理解的示例來完成這些任務。謝謝你。
我試圖解決的示例問題是:
哪個客戶下的訂單最多?
示例資料是:
客戶收藏:
{ "_id": { "$oid": "6276ba2dd1dfd6f5bf4b4f53" },
"Id": "1",
"FirstName": "Maria",
"LastName": "Anders",
"City": "Berlin",
"Country": "Germany",
"Phone": "030-0074321"},
{ "_id": { "$oid": "6276ba2dd1dfd6f5bf4b4f54" },
"Id": "2",
"FirstName": "Ana",
"LastName": "Trujillo",
"City": "México D.F.",
"Country": "Mexico",
"Phone": "(5) 555-4729" }
訂單收集:
{ "_id": { "$oid": "6276ba9dd1dfd6f5bf4b501f" },
"Id": "1",
"OrderDate": "2012-07-04 00:00:00.000",
"OrderNumber": "542378",
"CustomerId": "85",
"TotalAmount": "440.00" },
{ "_id": { "$oid": "6276ba9dd1dfd6f5bf4b5020" },
"Id": "2",
"OrderDate": "2012-07-05 00:00:00.000",
"OrderNumber": "542379",
"CustomerId": "79",
"TotalAmount": "1863.40" }
我整天都在看 youtube 視頻和 MongoDB 檔案,但我無法理解一些事情。一,在我執行 $group 函式時,我丟失了所有與組無關的欄位,我想保留一些欄位。我想讓它回傳訂單最高的客戶的姓名。
我正在使用的讓我參與其中的管道如下:
[{
$lookup: {
from: 'Customer',
localField: 'CustomerId',
foreignField: 'Id',
as: 'CustomerInfo'
}}, {
$project: {
CustomerId: 1,
CustomerInfo: 1
}}, {
$group: {
_id: '$CustomerInfo.Id',
CustomerOrderNumber: {
$sum: 1
}
}}, {
$sort: {
CustomerOrderNumber: -1
}}]
按順序回傳的示例資料:
為錯誤的格式道歉,仍然試圖掌握發布易于理解和有用的問題的竅門。
uj5u.com熱心網友回復:
在$group
階段,它只回傳帶有_id
和CustomerOrderNumber
欄位的檔案,因此CustomerInfo
缺少欄位。
$lookup
$project
- 從第一階段開始,CustomerInfo
作為陣列回傳,因此將第一個檔案作為檔案欄位而不是陣列欄位。$group
- 分組CustomerId
,將檔案相加為CustomerOrderNumber
,并將第一個檔案作為CustomerInfo
。$project
- 裝飾輸出檔案。$setWindowsFields
- 使用$denseRank按CustomerOrderNumber
(DESC) 對檔案位置進行排名。如果有相同的檔案CustomerOrderNumber
,排名會將它們視為相同的排名/位置。$match
- 選擇帶有denseRankHighestOrder
1(最高)的檔案。
db.Order.aggregate([
{
$lookup: {
from: "Customer",
localField: "CustomerId",
foreignField: "Id",
as: "CustomerInfo"
}
},
{
$project: {
CustomerId: 1,
CustomerInfo: {
$first: "$CustomerInfo"
}
}
},
{
$group: {
_id: "$CustomerInfo.Id",
CustomerOrderNumber: {
$sum: 1
},
CustomerInfo: {
$first: "$CustomerInfo"
}
}
},
{
$project: {
_id: 0,
CustomerId: "$_id",
CustomerOrderNumber: 1,
CustomerName: {
$concat: [
"$CustomerInfo.FirstName",
" ",
"$CustomerInfo.LastName"
]
}
}
},
{
$setWindowFields: {
sortBy: {
CustomerOrderNumber: -1
},
output: {
denseRankHighestOrder: {
$denseRank: {}
}
}
}
},
{
$match: {
denseRankHighestOrder: 1
}
}
])
示例 Mongo Playground
筆記:
$sort
階段能夠對檔案進行排序CustomerOrderNumber
。但是如果你嘗試限制諸如“SELECT TOP n”之類的檔案,當有多個具有相同CustomerOrderNumber/rank的檔案時,輸出結果可能不正確。
示例:SELECT TOP 1 Customer 的 CustomerOrderNumber 最高,但有 3 個客戶的 CustomerOrderNumber 最高。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/470769.html
標籤:数据库 mongodb nosql MongoDB指南针
下一篇:一個類的所有實體共享相同的值