标准使mongo查询

问题描述 投票:0回答:2

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

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

现在我尝试在春季启动时使用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() }))
);

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

java spring mongodb spring-boot criteria
2个回答
0
投票

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

  1. Criteria.where接受String,它是键/值对的关键。不是像$expr这样的查询运算符
  2. Arrays.asList返回由指定数组支持的固定大小的列表。它接受将列表作为参数备份的数组。你传递的是String
  3. 你不必逃避引号。你可以用'代替。

由于$expr在Spring中不支持常规查询,因此可以直接传递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);

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);
© www.soinside.com 2019 - 2024. All rights reserved.