MongoDB关系属性更新

问题描述 投票:1回答:1

我有两个名为"Books""Authors"的集合。此外,在书籍收藏中还有一个名为Author的子文档,如下所示

[{
  "Id" : "3535345345",
  "Title" : "Book Name",
  "Published" : "2015-02-20",
  "Author" : {
    "Id" : "344567656",
    "FirstName" : "Alex",
    "LastName" : "Tyler"
  }
},
{
  "Id" : "3535967667",
  "Title" : "Another Book",
  "Published" : "2016-08-12",
  "Author" : {
    "Id" : "344567656",
    "FirstName" : "Alex",
    "LastName" : "Tyler"
  }
}]

如您所见,"Author"文档在文档中重复,以便更快/更好地进行查询。正如我之前提到的,作者被记录在另一个集合中,并且书籍中包含了3个作者列。

第一个问题是:“MongoDB的结构是否正确?”

第二个问题是:“当我更新作者的姓氏时,最佳做法是什么?我应该如何更新书籍等更新的实际位置。”我尝试通过引用来自作者集合的Id进行更新,但在大数据场景中,我认为我不是最佳选择。

谢谢

mongodb data-structures database-design architecture foreign-keys
1个回答
2
投票

我认为最好的方法是在Books集合中存储Authors的_id。

如果你想填充Authors字段,你可以在$lookup集合上使用Books聚合,如下所示:

db.Books.aggregate({
   $lookup:
     {
       from: "Authors",//Author collection
       localField: "AuthorId",
       foreignField: "_id",
       as: "Author"
     }
})

您可以查看更多关于$lookup here的信息。

AuthorId收集的Books字段应该是ObjectId

您还可以在填充Books字段的情况下构建Author集合的视图(仅适用于Mongo 3.4+):

db.createView("Books_View", "Books", [{       
     $lookup: {
             from: "Authors",//Authors collection
             localField: "AuthorId",
             foreignField: "_id",
             as: "Author"
         }
    }
])

您可以像任何其他集合一样查询此视图:

db.Books_View.find({...})
© www.soinside.com 2019 - 2024. All rights reserved.