【问题标题】:Mongodb (v2.4.0) $match aggregate not working with date rangeMongodb (v2.4.0) $match 聚合不适用于日期范围
【发布时间】:2013-04-05 22:32:53
【问题描述】:

我正在使用 mongodb java 驱动程序通过 maven 存储库(如下 pom.xml 中)来查询日期范围与聚合框架之间的事务。 java 驱动程序生成以下 $match 我尝试在 mongo 控制台上验证并发现它不起作用:

db.transactions.aggregate(
{ "$match" : 
    { 
        "created_at" : { "$gt" : { "$date" : "2001-04-12T12:00:00.000Z"} , "$lte" : { "$date" : "2020-04-13T12:00:00.000Z"}}
    }
}
)

如果我删除 $date 块并将其替换为 ISOdate 函数和日期字符串,那么它似乎正在工作。我不明白为什么它在 java 中不起作用($match JSON - 我已经从 eclipse 中获取并在 mongo 控制台中尝试,但它也不起作用。)

pom.xml
<dependency>
    <groupId>org.mongodb</groupId>
    <artifactId>mongo-java-driver</artifactId>
    <version>2.11.0</version>
</dependency>

有人知道为什么 $date 不能使用 MongoDB v2.4.0 处理聚合吗?

【问题讨论】:

  • 试试答案,如果它不起作用,请告诉我。如果不起作用,请向我们提供有关数据库中数据存储的信息。因为我假设date 是您文档中created_at 中的嵌入文件。
  • 我试过了,但它不起作用。我提供的代码是由 MongoDB java 驱动程序生成的,因此我没有看到“”是一个问题。 created_at 是日期字段并保存 ISO 日期格式。请在下面找到 JSON 供您参考:{ "created_at" : ISODate("2013-04-18T10:42:22Z"), "payment_token" : "f7e595ec-1cdd-4e5d-93c5-eca8e5f9f876" }
  • 我已参考您提供的 JSON 更新了我的答案。请尝试让我们知道。由于相同的代码适用于 MongoDB 2.2.3,我希望它也适用于您的版本,没有问题。
  • 不,它不起作用。我正在使用 mongodb-win32-x86_64-2.4.0(即 v2.4.0)
  • 对不起,根据过去的转换,我没有任何线索可以解决...但是可以肯定,下面提供的代码确实可以在我的机器上运行

标签: java mongodb mongodb-query aggregation-framework


【解决方案1】:

您必须在传递给 $match 聚合之前格式化日期。

Order.aggregate([
        {
          $match: {
            createdAt: {
              $gte: new Date(req.body.startDate),
              $lt: new Date(req.body.endDate)
            }
          }
        },
        {
          $lookup: {
            from: 'acbinstallerpayments',
            localField: "_id",
            foreignField: 'customerObjectID',
            as: 'installerPaymentDetails'
          }
        }
      ]);

【讨论】:

  • 谢谢,刚刚成功。在发送日期的同时创建一个日期对象可以正常工作。
【解决方案2】:

我通过删除$match$date 字段上的""$ 前缀解决了这个问题。 为您删除相同的 $date$gt$lte

它应该看起来像

db.transactions.aggregate(
{ "$match" : 
         { 
          'created_at': { 
                         $gt: "2001-04-12T12:00:00.000Z", 
                         $lt: "2020-04-13T12:00:00.000Z"
                        }
         }
});

【讨论】:

  • 我正在使用 CFMongoDB (ColdFusion) 和 Mongo java 驱动程序,这种格式有效。我不得不在"$gt""$lt" 周围添加引号,但这可能只是ColdFusion 的要求。 (注意:有效的 JSON 需要双引号。也许 java 驱动程序当前不关心,但将来可能会。)
猜你喜欢
  • 2017-08-03
  • 2019-09-23
  • 2020-12-22
  • 1970-01-01
  • 2019-03-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-02
相关资源
最近更新 更多