Spring mongo中是否有任何内置函数可用于从两个具有一对一关系的不同文档中提取数据?

如何解决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 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?