我是 mongo 的學習者和新手。我正在嘗試根據特定欄位獲取最后的記錄。在 SQLselect * from powerandlevel group by deviceId order by desc limit 1中。所以在這個基于 deviceId 的 SQL 查詢中,我可以獲得每個 deviceId 的最后一條記錄。我想在 mongodb 中做同樣的事情
[{
_id: "ObjectId(6246ab45e95eac6c85726cfc)"
imageName: "IMG_123456.jpg"
eventTime: "2022-04-01T07:35:30.615Z"
deviceId: "48701ED21819"
},
{
_id: "ObjectId(6246ab45e95eac6c85726cfc)"
imageName: "IMG_123456.jpg"
eventTime: "2022-04-01T07:38:10.543Z"
deviceId: "58701ED21819"
},
{
_id: "ObjectId(6246ab45e95eac6c85726cfc)"
imageName: "IMG_123456.jpg"
eventTime: "2022-04-01T08:05:50.865Z"
deviceId: "48701ED21819"
}]
我正在使用這個查詢db.imageEvent.aggregate([{ "$group" : {"_id" : { "deviceId" : "$deviceId"}}}, {$sort: {eventTime: 1}}, { $limit : 1 }])
結果
[{ "_id" : { "deviceId" : "58701ED21819" } },
{ "_id" : { "deviceId" : "48701ED21819" } }]
并期待這樣的結果
[{
_id: "ObjectId(6246ab45e95eac6c85726cfc)"
imageName: "IMG_123456.jpg"
eventTime: "2022-04-01T07:38:10.543Z"
deviceId: "58701ED21819"
},
{
_id: "ObjectId(6246ab45e95eac6c85726cfc)"
imageName: "IMG_123456.jpg"
eventTime: "2022-04-01T08:05:50.865Z"
deviceId: "48701ED21819"
}]
uj5u.com熱心網友回復:
如果您不需要ObjectId每個結果的,只需要常用值和最新日期,您可以通過以下方式簡化它:
db.imageEvent.aggregate([
{
$group: {
_id: "$deviceId",
imageName: {$first: "$imageName"},
eventTime: {$max: "$eventTime"},
deviceId: {$first: "$deviceId"},
}
}
])
正如您在操場上看到的那樣,對于組相同
的$first值很方便。將為您提供$max最新日期。
這將阻止您對整個集合進行排序并在查詢期間創建大型檔案,因為檔案有一個上限。
uj5u.com熱心網友回復:
$sort- 按eventTimeDESC 排序。$group- 分組deviceId并通過 將第一個檔案帶入data欄位$first。$replaceRoot- 將輸入檔案替換為data。
db.imageEvent.aggregate([
{
$sort: {
eventTime: -1
}
},
{
"$group": {
"_id": {
"deviceId": "$deviceId"
},
data: {
$first: "$$ROOT"
}
}
},
{
"$replaceRoot": {
"newRoot": "$data"
}
}
])
示例 Mongo Playground
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/465219.html
