簡體   English   中英

用Mongoose中的單個MongoDB查詢返回與最新日期匹配的多個文檔

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM