Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/375.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 翻译;“数组列中的值”;MongoDB查询MongoDB Spring数据代码_Java_Mongodb_Aggregation Framework_Spring Data Mongodb - Fatal编程技术网

Java 翻译;“数组列中的值”;MongoDB查询MongoDB Spring数据代码

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

如何使用Java MongoDB Spring数据驱动程序将以下MongoDB查询转换为基于Java的查询

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