我有两个名为"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进行更新,但在大数据场景中,我认为我不是最佳选择。
谢谢
我认为最好的方法是在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({...})