【问题标题】:Match with substring in mongodb aggregation与 mongodb 聚合中的子字符串匹配
【发布时间】:2013-11-19 08:09:26
【问题描述】:

在我的 mongodb 集合中,我有一个 time_stamp="2013-06-30 23:58:37 928"。 我需要仅使用日期的“$match”,例如 time_stamp="2013-06-30"。那么我怎样才能得到这样的子字符串呢?

之前我尝试过使用 $substr,但它显示错误 "errmsg" : "exception: invalid operator: $substr"

【问题讨论】:

  • 这很常见,以至于有一个带有以下模式的食谱页面:cookbook.mongodb.org/patterns/date_range 它适用于字符串,如答案之一所示。
  • 另外,您将不使用索引的选项标记为答案。它需要进行完整的收藏扫描。

标签: regex mongodb


【解决方案1】:

我认为您尝试使用聚合框架进行查询,因为您尝试了 $match$substr 运算符。我创建了一个简单的示例来展示如何使用 $substr 在聚合框架上获得所需的结果。

我已将以下数据插入 MongoDB。

{ "_id" : ObjectId("528b343881d4fe2cfe0b1b25"), "time_stamp" : "2013-06-30 23:58:37 928" }
{ "_id" : ObjectId("528b343b81d4fe2cfe0b1b26"), "time_stamp" : "2013-06-30 23:58:37 928" }
{ "_id" : ObjectId("528b344c81d4fe2cfe0b1b27"), "time_stamp" : "2013-06-30 12:58:37 928" }
{ "_id" : ObjectId("528b344f81d4fe2cfe0b1b28"), "time_stamp" : "2013-06-30 12:58:23 928" }
{ "_id" : ObjectId("528b345381d4fe2cfe0b1b29"), "time_stamp" : "2013-06-31 12:58:23 928" }
{ "_id" : ObjectId("528b345981d4fe2cfe0b1b2a"), "time_stamp" : "2013-07-31 12:58:23 933" }

我编写了以下代码,使用$substr 运算符按日期分组。

db.myObject.aggregate(
{$project : {new_time_stamp : {$substr : ["$time_stamp",0, 10]}}},
{$group:{_id:"$new_time_stamp", "count": {$sum:1}}}
);

【讨论】:

  • 第三个参数是结束索引还是子串的长度,在文档中看不到任何内容。
  • 看起来是长度。
【解决方案2】:

$substr 操作失败,因为您没有这样的查找操作。您只能在aggregation framework 中使用它。你提到你有一个时间戳。这种情况需要查询by time interval

{time_stamp: {
  $gte: ISODate("2013-06-30T00:00:00Z"),
  $lt: ISODate("2013-06-31T00:00:00Z")
}}

我希望这个月有 31 天。如果它是一个字符串(这真的很糟糕,因为日期应该存储为日期)你必须使用正则表达式。

【讨论】:

  • 假设该字段被索引,这将比使用聚合框架更有效。 +1
猜你喜欢
  • 2021-04-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多