首先让我说明我知道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中。
答案 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})
我认为如果您使用嵌入,它会更容易,更直观,对大多数用例来说更快。