什么是最佳实践"加入"mongoose/mongodb中的一堆值而没有填充

Aus*_*vis 6 mongoose mongodb node.js

让我先说明我知道mongoose提供的填充方法,但由于我的工作决定将来转移到本地mongodb驱动程序,我不能再依赖填充来避免为自己工作了.

如果我有两个文档集合

People
{_id:1, name:Austin}
{_id:2, name:Doug}
{_id:3, name:Nick}
{_id:4, name:Austin}

Hobbies:
{Person: 1,  Hobby: Cars}
{Person:1, Hobby: Boats}
{Person:3, Hobby: Chess}
{Person:4, Hobby: Cars}
Run Code Online (Sandbox Code Playgroud)

我应该如何加入爱好者的每个文件.理想情况下,我宁愿只需要调用数据库两次以获取人员,第二次调用业余爱好,然后返回客户端应用程序对象,并将它们加入到eeter中.

Mar*_*erg 1

这取决于您最关心的问题是什么。一般来说,我会说将爱好嵌入到人们中,例如:

{
  "_id":1,
  "name":"Austin",
  "hobbies": [
    "Cars","Boats"
  ]
},
{
  "_id":2,
  "name":"Doug",
  "hobbies": []
},

{
  "_id":3,
  "name":"Nick",
  "hobbies": [
    "Chess"
  ]
},

{
  "_id":4,
  "name":"Austin",
  "hobbies": [
    "Cars"
  ]
}
Run Code Online (Sandbox Code Playgroud)

这将使您可以使用多键索引hobbies并允许如下查询:

db.daCollection.find({"hobbies":"Cars"})
Run Code Online (Sandbox Code Playgroud)

这将返回两个奥斯汀作为完整的文件。是的,我知道会有很多多余的条目。如果您想阻止这种情况,可以像这样建模:

{
  "_id": 1,
  "name":"Cars"
},...

{
  "_id":1,
  "name":"Austin",
  "hobbies": [
    1, ...
  ]
}
Run Code Online (Sandbox Code Playgroud)

这需要在爱好的名称字段上添加一个额外的索引才能提高效率。因此,当您想要找到每个喜欢汽车的人时,您需要找到_id并查询它,例如

db.person.find({"hobbies":1})
Run Code Online (Sandbox Code Playgroud)

我认为如果使用嵌入,它会更容易、更直观,并且对于大多数用例来说速度更快。