【问题标题】:MongoDB find first element in array that matches condition [duplicate]MongoDB在数组中找到匹配条件的第一个元素[重复]
【发布时间】:2019-03-02 11:44:06
【问题描述】:

我有一组具有以下结构的项目(高度简化):

{
    _id: 1,
    transfers: [
        {
            date: 2017,
            person: 'C'
        },
        {
            date: 2012,
            person: 'B'
        },
        {
            date: 2010,
            person: 'A'
        }
    ]
}

我想按日期查询它,以找出在给定时间点“拥有”该项目的人。我已经在一个 javascript 应用程序中实现了这一点,只需拉动整个传输数组并对其进行迭代,直到

searchDate > transfers[i].date

例如,搜索 2014 年的日期将返回人员 B

我觉得必须有可能单独在 Mongo 查询中实现这个逻辑,并减少我必须发送到我的应用程序的数据量(传输数组可以变得非常大)。我试图了解此处发布的其他解决方案,但我不确定我是否找到了任何特别适用于我的问题的解决方案,并且我缺乏编写 mongo 查询以适应任何类似我的需求的经验。

任何帮助将不胜感激。

干杯,

P

【问题讨论】:

    标签: mongodb aggregation-framework


    【解决方案1】:

    我用过MongoDB聚合框架

    Stage1 - 按date过滤transfers

    Stage2 - 展开 transfers 数组

    stage3 - 仅投影 person 字段

    db.collection.aggregate([
        {
            '$project': {
                'transfers': {
                    '$filter': {
                        'input': '$transfers', 
                        'as': 'transfer', 
                        'cond': {
                            '$eq': [
                                '$$transfer.date', 2017
                            ]
                        }
                    }
                }
            }
        }, {
            '$unwind': '$transfers'
        }, {
            '$project': {
                '_id': 0, 
                'person': '$transfers.person'
            }
        }
    ])
    

    【讨论】:

    • 问题是“第一个数组元素大于 2014”。因此 "...搜索 2014 年的日期将返回人 B"。 (实际上是 C 人)这不是你的回应。其实你的代码可以简化为.find({ "transfers.date": 2017}, { "transfers.$.person": 1 })。投影不是那么好,但它更快,您可以在客户端代码中提取值。但实际上这不是问题所问的。
    • 它实际上是小于 2014 年的第一个元素,但是您标记的重复问题应该可以解决问题,谢谢!
    猜你喜欢
    • 1970-01-01
    • 2012-05-14
    • 2016-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多