【发布时间】: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