Java 翻译;“数组列中的值”;MongoDB查询MongoDB Spring数据代码
如何使用Java MongoDB Spring数据驱动程序将以下MongoDB查询转换为基于Java的查询Java 翻译;“数组列中的值”;MongoDB查询MongoDB Spring数据代码,java,mongodb,aggregation-framework,spring-data-mongodb,Java,Mongodb,Aggregation Framework,Spring Data Mongodb,如何使用Java MongoDB Spring数据驱动程序将以下MongoDB查询转换为基于Java的查询 db.User.aggregate([ { $match : { $expr: { $in: [ "ADMIN", "$roles" ] } } }, { $sort : { "createdAt": 1 } }, { $limit : 1 } ]) 我在Kotlin中尝试的解决方案,我认为这是错误的(我不知道如何在用户文档中指定“角色”是一个字段) fun queryFirstAdmi
db.User.aggregate([
{ $match : { $expr: { $in: [ "ADMIN", "$roles" ] } } },
{ $sort : { "createdAt": 1 } },
{ $limit : 1 }
])
我在Kotlin中尝试的解决方案,我认为这是错误的(我不知道如何在用户文档中指定“角色”是一个字段)
fun queryFirstAdmin():用户?{
val matchRolesOpt=Aggregation.match(Criteria.where(“ADMIN”).`in`(“角色”))
val sortOpt=Aggregation.sort(sort.Direction.ASC,“createdAt”)
val limitOpt=聚合限制(1)
var ops:MutableList=mutableListOf()
操作添加(匹配角色列表)
新增操作(sortOpt)
补充行动(限制行动)
var aggregation=aggregation.newAggregation(*ops.toTypedArray())
val aggregationResult=mongoTemplate.aggregate(聚合,用户::class.java,用户::class.java)
返回aggregationResult.uniqueMappedResult
}
此解决方案可行,但不幸的是,它返回了用户文档的一部分(因为它已展开):
fun queryFirstAdmin():用户?{
val unwindOpt=聚合。解除(“角色”)
val matchRolesOpt=Aggregation.match(Criteria.where(“角色”)。`is`(“管理员”))
val sortOpt=Aggregation.sort(sort.Direction.ASC,“createdAt”)
val limitOpt=聚合限制(1)
var ops:MutableList=mutableListOf(取消登录、匹配角色登录、排序、限制选项)
var aggregation=aggregation.newAggregation(*ops.toTypedArray())
val aggregationResult=mongoTemplate.aggregate(聚合,用户::class.java,用户::class.java)
返回aggregationResult.uniqueMappedResult
}
i、 e.如果返回的文档具有数组[“ADMIN”],但原始文档在“角色”字段中具有[“ADMIN”,“USER]
如何修复此问题?用于聚合的MongoDB Spring数据Java代码:
MongoOperations mongoOps = new MongoTemplate(MongoClients.create(), "test");
Aggregation agg = newAggregation(
match(where("roles").is("ADMIN")),
sort(ASC, "createdAt"),
limit(1L)
);
AggregationResults<Document> results = mongoOps.aggregate(agg, "User", Document.class);
results.forEach(System.out::println);
可替换为此,结果相同:
{ $match : { roles: "ADMIN" } }
相同的查询使用:
Bson match=match(expr(Document.parse({$in:['ADMIN','$roles']}));
//-或-
//Bson匹配=匹配(eq(“角色”、“管理”);
列表管道=
asList(匹配、排序(升序(“createdAt”)、限制(1));
列表结果=新建ArrayList();
集合。聚合(管道)。导入(结果);
结果:forEach(System.out::println);
好的,你开始吧,我们会在你陷入困境时帮助你。你尝试过什么?Stack overflow不是一个只为你提供你从未尝试过的问题答案的网站。到目前为止,我已经做到了:(kotlin code)val matchRolesOpt=Aggregation.match(Criteria.where(“ADMIN”)(中的(“角色”))val sortOpt=Aggregation.sort(Sort.Direction.ASC,“createdAt”)val limitOpt=Aggregation.limit(1)角色实际上是一个数组列,我想匹配任何包含字符串“ADMIN”的数组。感谢您的帮助!太棒了!
MongoOperations mongoOps = new MongoTemplate(MongoClients.create(), "test");
Aggregation agg = newAggregation(
match(where("roles").is("ADMIN")),
sort(ASC, "createdAt"),
limit(1L)
);
AggregationResults<Document> results = mongoOps.aggregate(agg, "User", Document.class);
results.forEach(System.out::println);
{ $match : { $expr: { $in: [ "ADMIN", "$roles" ] } } }
{ $match : { roles: "ADMIN" } }
Bson match = match(expr( Document.parse(" { $in: [ 'ADMIN', '$roles' ] } ")));
// -or-
// Bson match = match(eq("roles", "ADMIN"));
List<Bson> pipeline =
Arrays.asList(match, sort(ascending("createdAt")), limit(1));
List<Document> results = new ArrayList<>();
collection.aggregate(pipeline).into(results);
results.forEach(System.out::println);