【问题标题】:MongoDB Relational Property UpdatesMongoDB 关系属性更新
【发布时间】:2018-06-01 14:11:21
【问题描述】:

我有两个名为 "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" 文档在文档中重复,以使查询更快/更好。正如我之前提到的,作者被记录在另一个集合中,并且 hust 3 列作者包含在书籍中。

第一个问题是:“这种结构对 MongoDB 来说是真的吗?”

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

谢谢

【问题讨论】:

  • 作者在文档中被复制如何使查询更快/更好?
  • 我的感觉是你不需要两个集合。由于 MongoDB 完全是无模式的,为什么不将 Author 作为单个唯一文档存储在 Books 集合本身中,并将其在数组中引用的书籍的所有 id 作为键值对之一作者文件?甚至查询也会更简单。
  • 我将通过提供样品来回答您的问题。第一个:从一个文档中查询书名和作者的名字和姓氏比通过作者的 objectid 查询另一个集合更好或更快。您可以想象 MSSQL Server 或其他 RDBMS 中的 INNER JOIN 查询。第二个:在我们的场景中这是不可能的,但是如果作者有 10 万本书怎么办?有可能超出 mongoDB 文档限制
  • 在现实世界中,没有作者可以拥有 10 万本书
  • 所以我希望我的第二条评论是你现在告诉我的。让我告诉你一些其他的事情......你不能对冗余以提高效率说“是”,同时又谈论大数据,兄弟。

标签: mongodb data-structures database-design architecture foreign-keys


【解决方案1】:

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

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

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

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

Books 集合上的AuthorId 字段应为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({...})

【讨论】:

  • 这是解决我的问题的一个选项,但它不是最好的方法。因为在我的真实场景中,有很多父对象(作者)并且聚合它们可能会花费很多。提前感谢
  • 我在一个大约有 2 百万个条目的集合上做了类似的事情。我认为它不会移动缓慢,因为您正在对索引字段进行聚合。
猜你喜欢
  • 2018-11-07
  • 1970-01-01
  • 2023-04-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-11
  • 1970-01-01
  • 2014-09-27
  • 1970-01-01
相关资源
最近更新 更多