【问题标题】:Querying MongoDB (Using Edge Collection - The most efficient way?)查询 MongoDB(使用边缘集合 - 最有效的方法?)
【发布时间】:2015-04-08 23:27:56
【问题描述】:

为了下面的示例,我编写了用户、俱乐部和追随者集合。 我想从“著名俱乐部”之后的用户集合中找到所有用户文档。 我怎样才能找到这些?哪种方式最快?

有关“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 获取文件。但是,创建 followers 数组大约需要 8 秒,其中包含 150.000 条记录。第二个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
        })
})

【问题讨论】:

  • 我没有看到问题...您在问“我如何才能找到它”,但您自己提供了解决方案。你的目标是什么?为什么您甚至会需要特定俱乐部的所有追随者的所有数据?显示这些结果可能没有意义?!没有更多上下文,您的问题没有什么可补充的......
  • 你好@mnemosyn,你是对的。我已经编辑了这个问题。我需要最有效的方法。如果处理数百万记录。感谢您的关注。
  • 为什么你需要一次在 RAM 中的所有数据?无论如何,您必须查明延迟的来源。请记住,默认批量大小仅为 1,000,因此此代码将需要至少 450 次数据库往返,加上实际的数据传输。我不知道猫鼬的开销是多少,但分析它可能会有所帮助。此外,$in 在大于大约 10,000 个元素的数组上可能会很慢。如果您无论如何都需要几乎所有数据,那么首先将所有数据加载到 RAM 中会更快吗?还是整个数据集更大?
  • 实际上我的收藏有更多字段,我应该查询两个收藏以获取过滤后的用户数。例如,我想从users 集合中查找 DateOfMonth 字段等于“April”的记录作为结果集。然后我应该从我的结果集中找到所有“著名俱乐部”的追随者。然后我将统计那些 DateOfMonth 等于 'April' 并关注 'A Famous Club' 的用户。我接触 MongoDB 才几个月。所以可能我做错了什么:) 事实上还没有大数据集。除了这个问题,几乎所有关于 MongoDB 的工作都已完成。
  • 我想我会放弃 Edge Collection achitecht。当我将follower 集合作为嵌入文档添加到users 集合时,我可以得到计数。 { "_id": "1", "fullname": "Jared", "country": "USA", "followedClubs": [ { "_id": "12", "name": "一个著名的俱乐部" } ]但是我知道这不是最佳实践。 askasya.com/post/largeembeddedarrays

标签: mongodb mongoose


【解决方案1】:

在 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"
}

【讨论】:

    猜你喜欢
    • 2012-10-14
    • 1970-01-01
    • 1970-01-01
    • 2015-10-09
    • 2017-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多