什么是最好的做法“连接”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} 

我应该怎么去join爱好者的每个文件。 理想情况下,我宁愿只需要调用数据库两次来获得人员,第二次获得业余爱好,然后返回到客户端应用程序对象与他们jointoeghter。

这取决于你最关心的是什么。 一般来说,我会说把爱好embedded到人民身上,例如:

 { "_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, ... ] } 

这将需要一个额外的爱好姓名字段索引是有效的。 所以当你想要find每一个进入汽车的人,你需要find_id并查询它

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

如果使用embedded,我认为它更简单,更直观,对于大多数用例来说更快。