[英]Return multiple documents which match the latest date with a single MongoDB query in Mongoose
以下是MongoDB查詢。 用Mongoose編寫此查詢的最佳方法是什么?
db.logs.find({date: db.logs.find({}, {date:1,"_id":0}).sort({date:-1}).limit(1).toArray()[0].date})
可能有多個具有相同日期的文檔,我們需要檢索所有與最新日期匹配的文檔。
聚合框架使其可以在單個查詢中編寫。 您將需要一個具有初始$lookup
運算符的管道來進行自我聯接,並在$lookup
執行對聯接集合的管道,該管道允許不相關的子查詢返回最新日期:
db.logs.aggregate([
{ "$lookup": {
"from": "logs",
"pipeline": [
{ "$sort": { "date": -1 } },
{ "$limit": 1 },
{ "$project": { "_id": 0, "date": 1 } }
],
"as": "latest"
} }
])
還需要進一步的步驟來重塑上面最新生產的新磁場,以使陣列變平。 使用$addFields
重塑和$arrayElemAt
扁平化陣列,或使用"$unwind"
:
db.logs.aggregate([
{ "$lookup": {
"from": "logs",
"pipeline": [
{ "$sort": { "date": -1 } },
{ "$limit": 1 },
{ "$project": { "_id": 0, "date": 1 } }
],
"as": "latest"
} },
{ "$addFields": { "latest": { "$arrayElemAt": ["$latest", 0] } } }
])
最后一步是在$match
階段使用$expr
過濾結果管道中的文檔,因為您將比較同一文檔中的字段:
db.logs.aggregate([
{ "$lookup": {
"from": "logs",
"pipeline": [
{ "$sort": { "date": -1 } },
{ "$limit": 1 },
{ "$project": { "_id": 0, "date": 1 } }
],
"as": "latest"
} },
{ "$addFields": { "latest": { "$arrayElemAt": ["$latest", 0] } } },
{ "$match": {
"$expr": {
"$eq": [ "$date", "$latest.date" ]
}
} }
])
使查詢進入Mongoose變得很簡單。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.