【问题标题】:How to query by age in Mongodb?如何在MongoDB中按年龄查询?
【发布时间】:2011-05-24 08:23:47
【问题描述】:

如果我在 MongoDB 中有一个 dob(出生日期)字段,如何查询出生日期小于 1/1/1990(它是一个字符串)或小于某个年龄的所有记录?

【问题讨论】:

    标签: date mongodb field


    【解决方案1】:

    您可以将您的 DOB 日期存储为 ISO 格式 - yyyymmdd - 作为一个简单的数字,即

    db.col.insert( { dob: 19910412 } )
    db.col.insert( { dob: 19900708 } )
    db.col.insert( { dob: 19880511 } )
    db.col.insert( { dob: 19870225 } )
    

    然后,要查找特定日期之前的所有日期,请执行以下操作:

    db.col.find( { dob: { $lt: 19900101 } } )
    

    向该字段添加索引将加速这些查询:

    db.col.ensureIndex( { dob: 1 } )
    

    【讨论】:

      【解决方案2】:

      将数据存储为 Date() 对象或 ISO 格式的字符串。在这两种情况下,您都可以使用标准的 $gt 或 $lt 运算符。

      【讨论】:

        【解决方案3】:

        我建议存储一个“真实的”日期对象而不是字符串。然后,您可以使用通常的比较运算符。如果你不能这样做,另一种方法是存储一个年龄整数。后者用处不大,因为它必须每年更新,但值得考虑。

        编辑:允许您使用现有数据的另一种方法是将匹配函数传递给 collection.find()。显然,这具有性能影响,因为必须为集合中的每个对象评估该函数。见$where docs。比如……

        var date =  function() {
            return new Date(this.dob) < new Date('1/1/1990');
        }
        
        db.mycollection.find(date);
        

        【讨论】:

        • 您还可以使用 ISO 格式将日期存储为字符串。与 ISO 日期的比较将非常有效,因为比较遵循字典顺序..
        • @Sentinel 知道有用。不过,OP 并没有以这种方式存储日期。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-02-23
        • 2022-01-19
        • 2011-02-01
        • 2022-01-14
        相关资源
        最近更新 更多