用Mongoose中的单个MongoDB查询返回与最新日期匹配的多个文档

时间:2018-08-31 08:00:19

标签: node.js mongodb mongoose mongodb-query

以下是MongoDB查询。用Mongoose编写此查询的最佳方法是什么?

db.logs.find({date: db.logs.find({}, {date:1,"_id":0}).sort({date:-1}).limit(1).toArray()[0].date})

可能有多个具有相同日期的文档,我们需要检索所有与最新日期匹配的文档。

1 个答案:

答案 0 :(得分:1)

聚合框架使它可以在单个查询中编写。您将需要具有初始 $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] } } }
])

最后一步是在 $expr 阶段使用 $match 过滤结果管道中的文档,因为您将比较字段来自同一文档:

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" ]
        } 
    } }
])

使查询进入猫鼬变得简单。