【发布时间】:2020-02-28 12:41:28
【问题描述】:
我有一个存储在 mongo 中的对象,如下所示(当我查看文档时,它在 RoboMongo 中是这样显示的):
{
"_id": ObjectId("5e579c8674f69d1c1451f3ae"),
...
"timestamp": NumberLong(1582800002779),
...
"_class": "regular"
}
我存储的对象是这样定义的:
public class MyObjectModel {
@Id
@Field(value = ID_FIELD_NAME)
private String id;
@Field(value = TIMESTAMP_FIELD_NAME)
private Long timestamp;
...
}
我的意图是在时间范围内获取对象列表。 这就是我使用 spring data mongo db 创建查询的方式:
public List<Criteria> generateAllCriteria() {
List<Criteria> criteriaList = new ArrayList<>();
Optional.ofNullable(searchCriteria.getFromTimestamp()).map(ts -> criteriaList.add(generateFromTimestampCriteria(ts)));
Optional.ofNullable(searchCriteria.getToTimestamp()).map(ts -> criteriaList.add(generateToTimestampCriteria(ts)));
return criteriaList;
}
private Criteria generateFromTimestampCriteria(Long fromTimestamp) {
Criteria critFromTimestamp = Criteria.where(TIMESTAMP_FIELD_NAME).gte(fromTimestamp);
log.debug("From Timestamp criteria {}", critFromTimestamp.getCriteriaObject().toJson());
return critFromTimestamp;
}
private Criteria generateToTimestampCriteria(Long toTimestamp) {
Criteria critToTimestamp = Criteria.where(TIMESTAMP_FIELD_NAME).lt(toTimestamp);
log.debug("To Timestamp criteria {}", critToTimestamp.getCriteriaObject().toJson());
return critToTimestamp;
}
...
List<Criteria> criteriaList = generateAllCriteria();
Criteria finalCriteria = new Criteria();
finalCriteria = finalCriteria.andOperator(criteriaList.toArray(new Criteria[criteriaList.size()]));
log.debug("Final criteria {}", finalCriteria);
Query query = new Query();
query.addCriteria(finalCriteria);
List<MyObjectModel> myObjects = mongoTemplate.find(query, MyObjectModel.class);
当我显示它们时的查询如下:
From Timestamp criteria { "timestamp" : { "$gte" : { "$numberLong" : "1582714365857" } } }
To Timestamp criteria { "timestamp" : { "$lt" : { "$numberLong" : "1582887165858" } } }
而最终的查询条件似乎是这样的:
o.s.data.mongodb.core.MongoTemplate - find using query: { "$and" : [{ "timestamp" : { "$gte" : { "$numberLong" : "1582714365857" } } }, { "timestamp" : { "$lt" : { "$numberLong" : "1582887165858" } } }] } fields: Document{{}} for class: class mypackage.model.MyObjectModel in collection: myObjectModel
乍一看似乎没问题,但是当我手动针对 Mongo 运行它时,它不会返回任何记录,这在我看来意味着它在某种程度上是不正确的。 以下是我在 Mongo 上运行的具体内容:
db.getCollection('my-collection').find({ "$and" : [{ "timestamp" : { "$gte" : { "$numberLong" : "1582707873806" } } }, { "timestamp" : { "$lt" : { "$numberLong" : "1582887165858" } } }] })
而且它显然不返回任何记录。但是当我修改查询并摆脱 $numberLong:
db.getCollection('my-collection').find({ "$and" : [{ "timestamp" : { "$gte" : 1582707873806 } }, { "timestamp" : { "$lt" : 1582887165858 } }] })
它就像一个魅力。
有人可以启发我并解释我做错了什么吗?应该如何以正确的方式完成? 如何使 spring data mongo 创建正确的查询?
不用说字符串和整数工作得很好。它只是关于LONGs。
提前感谢您的帮助。
【问题讨论】:
-
您的 Spring-Data MongoDB 查询是否运行并返回预期结果?
-
我不确定我是否理解您的问题。当我如上所述运行我的应用程序 spring data mongodb 查询时,不会返回任何条目。当我从 robomongo 运行查询时,它只有在我提供值时才会返回结果。当我按时间戳搜索时:...{$numberlong:"aNumber"} 它不返回任何内容。
-
事实上,当从 robomongo 而不是 $numberLong 调用时,应该使用 NumberLong() 函数。然后它工作正常。我在调查我的问题时了解到这一点。
-
这种方法有效吗?我也面临同样的问题,即 numberlong 被添加到查询参数中并且绝对没有结果。
标签: java spring mongodb spring-data-mongodb