【问题标题】:MongoDB query to retrieve distinct documents by dateMongoDB查询按日期检索不同的文档
【发布时间】:2018-02-07 08:46:01
【问题描述】:

我在数据库中有日期时间值如下的文档:

{
    "_id" : ObjectId("5a66fa22d29dbd0001521023"),
    "exportSuccessful" : true,
    "month" : 0,
    "week" : 4,
    "weekDay" : "Mon",
    "dateTime" : ISODate("2018-01-22T09:02:26.525Z"),
    "__v" : 0
}

我想:

  1. 查询给定日期的数据库,如果日期匹配(我不关心时间),则返回包含 dateTime 的文档。这主要是为了在插入该日期还没有的文档之前进行测试。在上面的示例中,如果我给定的日期是 2018-01-22,我希望返回文档。

  2. 从数据库中检索具有不同日期的所有文档(同样,我不关心时间部分)。如果有两个文档的日期相同(但时间不同),则返回第一个。

据我了解,Mongo 的 ISODate 类型不允许我只存储一个日期,它总是必须是一个 dateTime 值。而在我这边,我无法控制数据库中的内容。

【问题讨论】:

  • 给定的日期是字符串值还是时间设置为零的日期值?
  • @Veeram 我可以两者都做,我在客户端使用 moment.js 进行日期操作。

标签: mongodb date datetime


【解决方案1】:

尝试使用开始日期时间从一天开始到结束日期时间到一天结束的范围查询。所以基本上创建一个相隔一天的日期。

有点像

var start = moment().utc().startOf('day');
var end = moment().utc().endOf('day');

db.collection.find({
    dateTime: {
        $gte: start,
        $lte: end
    }
})

获取所有不同的日期文档:

db.collection.aggregate(
 {"$group":{
  "_id":{
    "$dateToString":{"format":"%Y-%m-%d","date":"$dateTime"}
  },
  "first":{
    "$first":"$$ROOT"
  }
}}])

【讨论】:

  • 谢谢@Veeram,我试试看。第二个 sn-p 中的$$ROOT 看起来很神奇,你能解释一下吗?
  • Yw。 $$ROOT 输出整个文档。更多here
猜你喜欢
  • 2014-07-14
  • 2017-02-27
  • 2020-05-16
  • 1970-01-01
  • 2016-04-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-14
相关资源
最近更新 更多