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

时间:2014-05-23 16:34:43

标签: node.js mongodb mongoose

首先让我说明我知道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}

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

1 个答案:

答案 0 :(得分: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"
  ]
}

这将使您可以在hobbies上使用多键索引,并允许这样的查询:

db.daCollection.find({"hobbies":"Cars"})

将两个Austins作为完整文件返回。是的,我知道会有很多冗余的条目。如果你试图阻止它,可以像这样建模:

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

{
  "_id":1,
  "name":"Austin",
  "hobbies": [
    1, ...
  ]
}

这需要在业余爱好的名称字段上有一个额外的索引才能有效。因此,当您想要找到每个进入汽车的人时,您需要找到_id并查询它,如

db.person.find({"hobbies":1})

我认为如果您使用嵌入,它会更容易,更直观,对大多数用例来说更快。