查询MongoDB(使用边缘收集 - 最有效的方法?)

时间:2015-02-09 09:09:22

标签: mongodb mongoose

我已经为了下面的例子而写了用户,俱乐部和粉丝。 我想找到来自以下"着名俱乐部"的用户集合中的所有用户文档。 我怎样才能找到这些?哪种方式最快?

有关' 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
        })
})

1 个答案:

答案 0 :(得分:0)

没有符合条件的公式来操纵MongoDB上的多对多关系。所以我将集合合并为嵌入式文档,如下所示。但在这种情况下,最重要的是创建索引。例如,如果您想按followingClubs进行查询,则应使用Mongoose创建类似schema.index({ 'followingClubs._id':1 })的索引。如果您想查询countryfollowingClubs,则应创建另一个索引,例如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"
}