【问题标题】:MongoDb Date query without using range?不使用范围的 MongoDb 日期查询?
【发布时间】:2014-01-24 23:55:06
【问题描述】:

如果我想查找在特定日期创建的文档,直到现在我使用了一个范围 从一天的第一分钟到一天的最后一分钟,以秒为单位,例如:

query":{"dtCreated":{"$gte":{"sec":1381356782,"usec":0},"$lt":{"sec":1389356782,"usec":0}}}

是否有可能以某种方式找到只有日、月和年等于 "dtCreated" 的所有文档?

在伪代码中:

query:{"dtCreated":ISODate("2014-01-23")} <- i know that may not be a valid iso date 

但我想要的是在不使用 lt 和 gt 的情况下查找一天的所有文档?

抱歉英语不好,任何提示提前谢谢!

【问题讨论】:

    标签: mongodb date


    【解决方案1】:

    您可以使用 date aggregation operators 在聚合框架中完成此操作。 假设 dtCreated 是一个 ISODate 字段,您可以尝试这样的操作:

    query = [
        {
            '$project': {
                'year': {'$year':'$dtCreated'}, 
                'month': {'$month':'$dtCreated'}, 
                'day':{'$dayOfMonth':'$dtCreated'}
            }
        }, 
        {
            '$match' : {'year':'2014', 'month':'1', day:'1'}
        }
    ]
    
    db.mycollection.aggregate(query)
    

    编辑:正如 orid 正确评论的那样,虽然这是对您问题的回答(查询日期而不使用日期范围),但这不是解决问题的好方法。我可能会这样做:大于或等于今天,但小于明天的范围

    db.foo.find({'dtCreated':{'$gte':ISODate("2014-01-23"), '$lt':ISODate("2014-01-24")}})
    

    【讨论】:

    • 不错的,效果很好,正是我正在寻找的! ! !非常感谢
    • @johnSmith 请注意,尽管上面的代码运行良好,但远非无害。因为它首先使用$project,所以它不会从您的集合中过滤任何文档,尽管您确实想匹配一天。其次,$match 如果存在,则不能使用 dtCreated 索引,因为它不直接使用集合中的数据。您的方法没有问题($gt & $lt 查询)。如果您坚持,您可以添加一个额外的相等字段,其值为一年中的某一天
    • 我意识到了这一点。不幸的是,日期运算符在聚合框架之外不可用
    猜你喜欢
    • 1970-01-01
    • 2014-05-17
    • 1970-01-01
    • 2018-06-12
    • 2018-07-09
    • 2018-09-18
    • 1970-01-01
    • 1970-01-01
    • 2014-09-29
    相关资源
    最近更新 更多