【问题标题】:Mongo DB searching for occurances by dateMongodb按日期搜索事件
【发布时间】:2019-12-08 21:39:43
【问题描述】:

所以我的 MonogDB 中存储了一个大型数据集,每次在我的 iTunes 库中播放一首歌曲,所以每个文档都包含艺术家姓名、歌曲名称和播放日期/时间。我目前可以使用以下查询在数据库中搜索一首歌曲的出现次数最多,这基本上给出了我播放它的总次数:

db.apple.aggregate([{ $sortByCount: "$song" }])

返回:

{ "_id" : "Fireflies (feat. Grieves)", "count" : 336 }
{ "_id" : "Cinderella (feat. Ty Dolla $ign)", "count" : 267 }
{ "_id" : "Check", "count" : 241 }
{ "_id" : "100 Grandkids", "count" : 240 }
{ "_id" : "Late For the Sky (feat. Slug & Aesop Rock)", "count" : 226 }

这将返回我在数据库中播放的 5 年歌曲中播放的总次数。我希望能够做的是创建一个查询,它返回特定年份的歌曲播放总数。我有以下查询:

db.apple.find({"playTime" : {$regex : ".*2019*"}}).pretty()

这个返回了一年内播放的所有歌曲,但我不知道如何结合这两个查询。

【问题讨论】:

  • 请分享 1 或 2 个输入文档。我怀疑我们可以在处理日期时间方面做得更好。
  • 日期和时间的一个例子是:{"playTime" : "2017-06-17T06:04:40.230Z"},我只需要处理年份,但我提供了播放的确切时间
  • 在您的第二个查询中,您不能在 aggregate 中使用 $match 吗?如果是这样,在aggregate 中运行这两个操作...

标签: regex mongodb nosql mongodb-query


【解决方案1】:

假设playTime 是字符串数据类型({ "playTime" : "2017-06-17T06:04:40.230Z" }),使用$substrCP 提取字符串的前4 个字符并转换为整数并匹配输入年份$sortByCount 阶段将保持原样。转换为整数是可选的;如果不使用,输入年份应该是一个字符串。

例如(使用整数年份):

var INPUT_YEAR = 2017

db.test.aggregate( [
  { 
      $match: { 
          $expr: { 
              $eq: [ INPUT_YEAR,  { $toInt: { $substrCP: [ "$playTime", 0, 4 ] } }  ]  
          } 
      } 
  },
  { 
      $sortByCount:  "$song" 
  }
] )

【讨论】:

  • 仍然会建议 OP 使用实时日期时间而不是 ISO8601 字符串...
【解决方案2】:

由于您已经准备好查询,您只需要将它们放在与 JBone 在 cmets 中建议的相同的聚合管道中。如果您的查询像您提到的那样工作,这将起到作用:

db.apple.aggregate([
{ $sortByCount: "$song" },
{ $match: { "playTime" : {$regex : ".*2019*"} } }
])

【讨论】:

    【解决方案3】:

    如果playTimeISO 8601格式的字符串,那么你可以试试这个:

    db.apple.aggregate([{
        $match: {
            $expr: {
                $eq: [2019, {
                    $year: {
                        $dateFromString: {
                            dateString: '$playTime'
                        }
                    }
                }]
            }
        }
    }, { $sortByCount: "$song" }])
    

    或者,如果您可以将其更改为/拥有ISODate(),那么:

    db.apple.aggregate([{
        $match: {
            $expr: {
                $eq: [2019, {
                    $year: '$playTime'
                }]
            }
        }
    }, { $sortByCount: "$song" }])
    

    参考: $year,$dateFromString,$match$isoWeekYear

    【讨论】:

      猜你喜欢
      • 2019-02-06
      • 2019-03-18
      • 1970-01-01
      • 2019-02-27
      • 1970-01-01
      • 1970-01-01
      • 2016-09-27
      • 2015-04-25
      • 1970-01-01
      相关资源
      最近更新 更多