条件进行mongo查询

时间:2019-02-18 23:28:02

标签: java spring mongodb spring-boot criteria

我尝试进行一些查询以查找有生日的用户。 该查询是:

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() }))
);

有人知道我如何构建此查询吗?

2 个答案:

答案 0 :(得分:0)

在您尝试建立的查询中,我可以发现一些错误:

  1. Criteria.where接受作为键/值对的键的String。不是像$expr
  2. 这样的查询运算符
  3. Arrays.asList返回由指定数组支持的固定大小的列表。它接受将作为参数支持列表的数组。您正在传递String
  4. 您不必转义引号。您可以改用'

由于春季尚不支持$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);