如何解决MongoDB 通过外来文档查找和过滤
我有 user
集合,其中包含具有 roleId 的角色对象。我也有 roles
集合,它有 id。
现在,对于每个角色,我想获取用户列表。
例如:
[
{
"name": "Scott","isActive": true,"role": {
"roleId": "123432"
}
},{
"name": "John",{
"name": "Scott","role": {
"roleId": "556432"
}
}
]
角色数据:
[
{
"id": "123432"
"name": "admin","type": "internal"
},{
"id": "556432"
"name": "owner","type": "external"
},"type": "internal"
}
]
现在我想获取所有类型为 internal
的角色及其相关用户:
所以,输出应该是,
[
{
"role": "123432","users": [
{
"name": "Scott","role": {
"roleId": "123432"
}
},{
"name": "John","role": {
"roleId": "123432"
}
}
],{
"role": "556432","users": []
}
}
]
这是我在 SpringBoort 中的聚合:
LookupOperation lookupOperation = LookupOperation.newLookup().from("roles").localField("roleId")
.foreignField("_id").as("roles");
Aggregationoperation match = Aggregation.match(Criteria.where("type").is("internal"));
Aggregation aggregation = Aggregation.newAggregation(lookupOperation,match);
List<UserDTO> results = mongoTemplate.aggregate(aggregation,"users",UserDTO.class).getMappedResults();
但这行不通。匹配过滤器 ois 与主表(用户)字段一起使用。但它不适用于外部集合(角色)
有人可以帮我吗?
解决方法
AggregationOperation isActiveMatch= Aggregation.match(Criteria.where("isActive").is(true));
应该是第一场比赛。
LookupOperation lookupOperation = LookupOperation.newLookup().from("roles").localField("roleId")
.foreignField("_id").as("roles");
AggregationOperation match = Aggregation.match(Criteria.where("type").is("internal"));
Aggregation aggregation = Aggregation.newAggregation(isActiveMatch,lookupOperation,match);
更新 1
你可能会期待这样,
db.user.aggregate([
{
"$lookup": {
"from": "roles","localField": "role.roleId","foreignField": "id","as": "roles"
}
},{
$project: {
roles: {
"$filter": {
"input": "$roles","cond": {
$eq: [
"$$this.type","internal"
]
}
}
}
}
},{
$match: {
roles: {
$ne: []
}
}
}
])
这里需要在查找后添加两个阶段。第一个是过滤区间,第二个是消除空的角色数组。
ProjectionOperation as =
project()
.and(
ArrayOperators.Filter.filter("roles")
.as("role")
.by(ComparisonOperators.Eq.valueOf("role.type").equalTo("interval")))
.as("roles");
我已经添加了项目阶段,希望您可以添加匹配阶段。上面的代码没有经过测试,而是基于工作脚本编写的。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。