我尝试进行一些查询以查找有生日的用户。 该查询是:
db.getCollection('_user').find({
"$and" : [
{"$expr" : [{ "$dayOfMonth": "$time_created" } , { "$dayOfMonth": new Date() }]},
{"$expr" : [ { "$month": "$time_created" } , { "$month": new Date() }]},
{"$expr" : { "$ne" : [ { "$year": "$time_created" } , { "$year": new Date() }]}}
]
})
现在我在Spring Boot中使用Criteria进行了查询:
criteria.andOperator(
Criteria.where("$expr").is(Arrays.asList("{ \"$dayOfMonth\": \"$time_created\" }", "{ \"$dayOfMonth\": new Date() }")),
Criteria.where("$expr").is(Arrays.asList("{ \"$month\": \"$time_created\" }", "{ \"$month\": new Date() }")),
Criteria.where("$expr").ne(Arrays.asList("{ \"$year\": \"$time_created\" }", "{ \"$year\": new Date() }"))
);
如果我这样做,则将其作为最终查询:http://prntscr.com/mmxbg3 而所有这些\和“都出了问题
但是,如果我在标准查询中没有这些字符,则由于语法而会出错:
criteria.andOperator(
Criteria.where("$expr").is({"$dayOfMonth": "$time_created" }, { "$dayOfMonth": new Date() })),
Criteria.where("$expr").is(Arrays.asList({ "$month": "$time_created" }, { "$month": new Date() })),
Criteria.where("$expr").ne(Arrays.asList({ "$year": "$time_created" }, { "$year": new Date() }))
);
有人知道我如何构建此查询吗?
答案 0 :(得分:0)
在您尝试建立的查询中,我可以发现一些错误:
Criteria.where
接受作为键/值对的键的String
。不是像$expr
Arrays.asList
返回由指定数组支持的固定大小的列表。它接受将作为参数支持列表的数组。您正在传递String
。'
。由于春季尚不支持$expr
,因此在常规查询中,您可以直接传递json查询。
TimeZone tz = TimeZone.getTimeZone("UTC");
DateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm'Z'"); // Quoted "Z" to indicate UTC, no timezone offset
df.setTimeZone(tz);
String nowAsISO = df.format(new Date());
Query query = new BasicQuery("{
'$and' : [
{'$expr' : [{ '$dayOfMonth': '$time_created' } , { '$dayOfMonth': "+ nowAsISO +" }]},
{'$expr' : [ { '$month': '$time_created' } , { '$month': "+ nowAsISO +" }]},
{'$expr' : { '$ne' : [ { '$year': '$time_created' } , { '$year': "+ nowAsISO +" }]}}
]
}")
List<Document> results = mongoTemplate.find(query, Document.class);
答案 1 :(得分:0)
Aggregation datastoreAggr = newAggregation(match(Criteria.where("metaId.ref.uuid").in(datapodUUID)),sort(Direction.DESC, "createdOn"));
AggregationResults<DataStore> datastoreResults = mongoTemplate.aggregate(datastoreAggr, "datastore", DataStore.class);
List<DataStore> datastoreList = datastoreResults.getMappedResults();
您可以直接使用Java内置函数,并且可以像我已经通过的那样传递字段。 您需要使用汇总,也可以使用条件。 Here is Criteria Related Answer is posted, please look at this
:-Please See this Doc for query related manual
我建议您可以在用户文档中存储dateOfBirthday作为时间毫秒,并可以通过编写一个简单的方法直接获取所有用户。
您可以在DAO类中编写此方法,并且可以避免“聚合”和“标准”。
@Query(value = "{ 'dateOfBirthday' : ?0 }")
public List<User> findUserByDateOfBirthday( String dateOfBirthday);