我已经为了下面的例子而写了用户,俱乐部和粉丝。 我想找到来自以下"着名俱乐部"的用户集合中的所有用户文档。 我怎样才能找到这些?哪种方式最快?
有关' what do I want to do - Edge collections'的更多信息
用户集合
{
"_id": "1",
"fullname": "Jared",
"country": "USA"
}
俱乐部系列
{
"_id": "12",
"name": "A famous club"
}
粉丝收藏
{
"_id": "159",
"user_id": "1",
"club_id": "12"
}
PS:我可以像下面这样使用Mongoose获取文件。但是,使用150.000条记录创建followers
数组大约需要8秒。第二个find
查询 - 使用关注者数组查询 - 需要约40秒。这是正常的吗?
Clubs.find(
{ club_id: "12" },
'-_id user_id', // select only one field to better perf.
function(err, docs){
var followers = [];
docs.forEach(function(item){
followers.push(item.user_id)
})
Users.find(
{ _id:{ $in: followers } },
function(error, users) {
console.log(users) // RESULTS
})
})
答案 0 :(得分:0)
没有符合条件的公式来操纵MongoDB上的多对多关系。所以我将集合合并为嵌入式文档,如下所示。但在这种情况下,最重要的是创建索引。例如,如果您想按followingClubs
进行查询,则应使用Mongoose创建类似schema.index({ 'followingClubs._id':1 })
的索引。如果您想查询country
和followingClubs
,则应创建另一个索引,例如schema.index({ 'country':1, 'followingClubs._id':1 })
使用嵌入式文档时请注意:http://askasya.com/post/largeembeddedarrays
然后你就可以快速得到你的文件。我试图用这种方式计算150.000个记录,只花了1秒钟。这对我来说已经足够......
ps:我们不要忘记在我的测试中,我的Users
集合从未经历过任何数据碎片。因此我的查询可能表现出良好的表现特别是followingClubs
嵌入文档数组。
用户集合
{
"_id": "1",
"fullname": "Jared",
"country": "USA",
"followingClubs": [ {"_id": "12"} ]
}
俱乐部系列
{
"_id": "12",
"name": "A famous club"
}