在MongoDB C#驱动程序中插入包含对另一个实体的引用的实体

在MongoDB C#驱动程序中插入包含对另一个实体的引用的实体,c#,mongodb,mongodb-.net-driver,C#,Mongodb,Mongodb .net Driver,我是NoSQL数据库的新手,因为我总是使用SQL。我在如何插入包含对单独文档对象的引用的实体方面遇到了一个问题。根据最佳实践等 下面是代码(去掉不必要的位) MongoDB的实体(存储库可以包含许多项目,但最常被查询、添加、更新和删除的是项目实体,因此不引用存储库中的项目集合,反之亦然) 有一个API端点,它接受一个DTO,如下所示: //DTOs are not *that* small, each contains several primitive properties public cl

我是NoSQL数据库的新手,因为我总是使用SQL。我在如何插入包含对单独文档对象的引用的实体方面遇到了一个问题。根据最佳实践等
下面是代码(去掉不必要的位)

MongoDB的实体(存储库可以包含许多项目,但最常被查询、添加、更新和删除的是项目实体,因此不引用存储库中的项目集合,反之亦然)

有一个API端点,它接受一个DTO,如下所示:

//DTOs are not *that* small, each contains several primitive properties
public class ProjectDto 
{
    public string Name { get; set; }
    public Repository Repository { get; set; }

}
public class Repository
{
    public string Name { get; set; }
}
控制器接受此项目DTO,并应将其插入数据库,心中有3个目标

  • 如果ProjectDTO中指定的存储库不存在(基于名称),则需要添加该存储库
  • 如果存储库已经存在,则需要添加新项目,并且存储库ID应指向现有存储库
  • 如果项目已经存在,只需更新即可。存储库应该已经被正确分配了
  • 根据本文档,我的应用程序中的DB访问发生在服务类中

    现在,问题1:

    将DTO传递给服务类,然后让它映射到实体并执行插入等操作,这是一种好模式吗。?不这样认为,但可能:)

    无论如何,我可以通过以下方式实现目标:

  • 基于名称查找存储库(DB调用#1)
  • 如果它不存在,则添加它(DB调用#2)
  • 返回现有存储库的ID
  • 查找现有项目(按存储库ID匹配的名称获取项目)(DB调用#3/4)
  • 如果确实存在,则进行更新(数据库调用#4/5)
  • 将DTO映射到项目实体并将RepositoryId分配给现有存储库的ID
  • 将新项目插入项目集合(DB调用#4/5)
  • 问题#2:

    这种方法行吗?


    提前向您致以问候和感谢。

    您可以在中查看mongo文档以获取更新。选中IsUpsert选项,我认为它可以实现您想要的:

    向上插入选项

    如果UpdateOne、UpdateMany或ReplaceOne包含 Isupert选项设置为true的UpdateOptions参数实例 并且没有与指定筛选器匹配的文档,则执行该操作 创建新文档并将其插入。如果有匹配的 文档,然后该操作修改或替换匹配 一份或多份文件

    还要复习文章。您可以更改存储数据的方式,在每个存储库文档中嵌入存储库和项目

    //DTOs are not *that* small, each contains several primitive properties
    public class ProjectDto 
    {
        public string Name { get; set; }
        public Repository Repository { get; set; }
    
    }
    public class Repository
    {
        public string Name { get; set; }
    }