与mongodb聚合中的子字符串匹配

时间:2013-11-19 08:09:27

标签: regex mongodb

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

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

2 个答案:

答案 0 :(得分:5)

我认为您尝试使用聚合框架进行查询,因为您尝试了$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}}}
);

答案 1 :(得分:3)

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

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

我希望这个月有31天。如果它是一个字符串(由于日期应该存储为日期而非常糟糕),您必须使用正则表达式。