如何解决Spring mongo中是否有任何内置函数可用于从两个具有一对一关系的不同文档中提取数据?
我只是想在春季使用Mongo模板从mongodb中具有一对一关系的两个不同文档中提取数据。
我有两个文档“ Rosters”(属于用户的嵌入式文档)和“ Unread”都由“ ucid”标识,“ ucid”是“唯一对话标识符”的首字母缩写。基于ucid,我想执行内部联接操作并提取数据。 有很多示例将查找和聚合用于OnetoMany关系,而不用于OnetToOne。
以下是课程
**User**
class User
{
private List<Roster> rosterList;
}
**Roster**
public class Roster extends Parent
{
@Id
private ObjectId _id;
@Indexed
private String author;
@Unique
private String ucid;
}
**Unread**
public class
{
@Id
@Indexed(unique=true) //todo: create index on mongo side as well
private String ucid;
private Map<String,Long> memberAndCount;
}
----------------------------------------------------
Sample Data:
USER (roster)
{user:{id:1001,username: dilag,roster:
[{
ucid:r0s122,name:sam}
},{
ucid:r0s123,name:ram}
},{
ucid:r0s124,name:rat}
}]}
UNREAD
{
ucid:r0s122,usernameAndCount:[{username:dilag,count:100},{username:ramg,count:20}],ucid:r0s123,count:20}]
}
Desired Output
{
ucid:r0s122,name :sam,name:ram,count:20}]
}
解决方法
下面的spring代码未经测试,但基于有效的Mongo playground编写。
基本上,您需要了解有关使用$lookup
加入Mongodb的信息。在这里,我使用了Joining Uncorrelated Sub-queries
public List<Object> test() {
Aggregation aggregation = Aggregation.newAggregation(
l-> new Document("$lookup",new Document("from","user")
.append("let",new Document("uid","$uicd"))
.append("pipeline",Arrays.asList(
new Document("$unwind","$user.roster"),new Document("$match",new Document("$expr",new Document("$eq",Arrays.asList("$user.roster.ucid","$$uid"))
)
)
)
).append("as","users")
),a-> new Document("$addFields",new Document("name",new Document("$ifNull",Arrays.asList(
new Document("$arrayElemAt",Arrays.asList("$users.user.roster.name",0)),""
)
)
)
)
).withOptions(AggregationOptions.builder().allowDiskUse(Boolean.TRUE).build());
return mongoTemplate.aggregate(aggregation,mongoTemplate.getCollectionName(Unread.class),Object.class).getMappedResults();
}
阅读this了解如何在mongo spring-data不使用new Document()
提供任何操作的情况下进行聚合的技巧。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。