【问题标题】:MongoDB : Find/filter data by today date of birth without aggregationMongoDB:按今天的出生日期查找/过滤数据,无需聚合
【发布时间】:2018-05-10 21:46:01
【问题描述】:

我正在开发用户可以上传数据的产品,并且数据的数据类型将在上传时由用户动态获取。我将数据存储在 mongodb 中。用户可以在前端编写规则来分割数据。其中一个要求是,可以给出规则以查找出生日期为今天的所有记录。为此,我可能需要按日和月过滤文档。截至目前,我正在根据用户给出的规则动态地将 mongo 查询(java)构建为 BasicDBObject。

因此过滤器需要像 $date.month=12 && $date.day=10 那样发生(以获取出生日期低于 1​​2 月 10 日的所有记录)。

有人可以帮助如何在 Mongo 查询中实现它吗?

【问题讨论】:

  • 我不想通过聚合来实现这一点。我在这里做的实际过程是获取所有文档并通过应用过滤器和投影来迭代它们。我没有使用聚合。

标签: mongodb collections aggregation-framework dbobject


【解决方案1】:

使用聚合框架没有任何问题。我什至会说,无论如何,它迟早会成为所有查询的默认设置——至少在内部......

尽管如此,没有它,您实际上有三个选项,因为“正常”查询没有日期运算符:

  1. 您可以尝试使用效率不高的 $where 运算符:https://docs.mongodb.com/manual/reference/operator/query/where/
  2. 您可以将日期部分信息(可能另外)存储在各个字段中,并在查询中简单地使用它们。这些字段可以被索引,所以这会很快。
  3. 日期在 MongoDB (https://docs.mongodb.com/manual/reference/method/Date/) 中存储为 Unix 时间戳。因此,您可以尝试计算相关数字或范围,并使用(一堆)长值访问它们。

【讨论】:

    【解决方案2】:

    这就是迭代文档的方式。这里没有任何聚合。

    MongoCollection<Document> mongoCollection = mongoDatabase.getCollection(collectionName);
        FindIterable<Document> iterable;
        iterable = (ruleQuery == null) ? mongoCollection.find().limit(limit).skip(skipCount) : mongoCollection.find(ruleQuery).limit(limit).skip(skipCount);
        iterable = (projectionFieldsQuery == null) ? iterable : iterable.projection(projectionFieldsQuery);
        iterable = (sortQuery == null) ? iterable : iterable.sort(sortQuery);
        return iterable.iterator();
    

    【讨论】:

      猜你喜欢
      • 2015-04-11
      • 1970-01-01
      • 1970-01-01
      • 2015-06-02
      • 2017-03-11
      • 1970-01-01
      • 2020-05-04
      • 2020-05-12
      • 1970-01-01
      相关资源
      最近更新 更多