【问题标题】:Return multiple documents which match the latest date with a single MongoDB query in Mongoose使用 Mongoose 中的单个 MongoDB 查询返回与最新日期匹配的多个文档
【发布时间】:2018-09-20 01:57:17
【问题描述】:

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

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

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

【问题讨论】:

  • 有2个查询。
  • @chridam,使用您的查询将只返回 1 条记录。但是,如果有多个文档具有最新日期,它将只选择 1 并忽略其他文档。这不应该发生
  • 这些查询有什么问题? const date = await db.logs.find({ }, { date: 1, _id: false }).sort({ date: -1 }).limit(1) 然后const data = await db.logs.find({ date: date[0].date })

标签: node.js mongodb mongoose mongodb-query


【解决方案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] } } }
])

最后一步是在 $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 中变得很简单。

【讨论】:

    猜你喜欢
    • 2019-05-06
    • 1970-01-01
    • 2020-11-17
    • 2017-10-01
    • 2018-08-20
    • 2020-02-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多