我是 MongoDb 的新手。我需要幫助來獲取最后 n 個月的記錄,每個月可能有多個條目,但查詢只需要回傳每個月的最后一個條目。
例如,假設 n 是3并且 userId 是userId1(這意味著回傳過去 3 個月的記錄userId1)。
集合中的示例輸入:
[
{
"_id": objectId("aaaaaa"),
"userId": "userId1",
"processedAt": "2021-06-01T12:16:49.349Z"
},
{
"_id": objectId("bbbbb"),
"userId": "userId1",
"processedAt": "2021-10-11T12:16:49.349Z"
},
{
"_id": objectId("ccccc"),
"userId": "userId1",
"processedAt": "2021-10-25T12:16:49.349Z"
},
{
"_id": objectId("eeeee"),
"userId": "userId1",
"processedAt": "2021-09-12T12:16:49.349Z"
},
{
"_id": objectId("fffff"),
"userId": "userId1",
"processedAt": "2021-09-28T12:16:49.349Z"
},
{
"_id": objectId("ggggg"),
"userId": "userId1",
"processedAt": "2021-09-23T12:16:49.349Z"
},
{
"_id": objectId("hhhhh"),
"userId": "userId1",
"processedAt": "2021-07-23T12:16:49.349Z"
},
{
"_id": objectId("iiiii"),
"userId": "userId2",
"processedAt": "2021-09-29T12:16:49.349Z"
},
{
"_id": objectId("jjjjj"),
"userId": "userId1",
"processedAt": "2022-01-29T12:16:49.349Z"
},
{
"_id": objectId("kkkkk"),
"userId": "userId1",
"processedAt": "2022-02-29T12:16:49.349Z"
},
]
預期結果:應按userId回傳,限制n個月(只獲取當月最后保存的條目)和processedAt月份的升序:
[{
"_id": objectId("ccccc"),
"userId": "userId1",
"processedAt": "2021-10-25T12:16:49.349Z"
},
{
"_id": objectId("jjjjj"),
"userId": "userId1",
"processedAt": "2022-01-29T12:16:49.349Z"
},
{
"_id": objectId("kkkkk"),
"userId": "userId1",
"processedAt": "2022-02-29T12:16:49.349Z"
}
]
我嘗試過下面的查詢,但是它回傳了所有記錄。我希望查詢只需要考慮每月的最后一個條目。我一直在使用 mongojs 驅動程式v4.1.2
db.collection(collection_name)
.find({ userId: userId }, { projection: { _id: 0 } })
.sort({ processedAt: -1 })
.limit(n)
.toArray()
uj5u.com熱心網友回復:
從 MongoDB 5.0 開始,
您可以使用$setWindowFields為“磁區”/“組”(即您示例中的月份)匯總“排名”,并僅選擇排名最高的檔案。
排名可以定義為processedAt: -1您只想保留排名最高的月份中的最新記錄。
{
"$setWindowFields": {
"partitionBy": {
"$dateToString": {
"date": "$processedAt",
"format": "%Y-%m"
}
},
"sortBy": {
"processedAt": -1
},
"output": {
"rank": {
$rank: {}
}
}
}
}
這是Mongo 游樂場供您參考。
對于 MongoDB 3.6 ,
由于樣本資料集使用 ISODate 格式,因此可以按最左邊的 7 個字符(即 yyyy-MM)對欄位進行排序和分組。只保留月組中的第一個檔案應該可以解決問題。
{
$sort: {
processedAt: -1
}
},
{
"$addFields": {
"month": {
"$substrCP": [
"$processedAt",
0,
7
]
}
}
},
{
$group: {
_id: "$month",
last: {
$first: "$$ROOT"
}
}
}
這里是Mongo 游樂場。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/335969.html
