【问题标题】:Mongo -Select parent document with maximum child documents count, Faster way?Mongo - 选择具有最大子文档数的父文档,更快的方式?
【发布时间】:2015-01-14 08:46:33
【问题描述】:

我对 mongo 很陌生,并试图在查询之后开始工作。并且工作正常,但它需要更多时间。我觉得我做错了什么。

集合parent 中有很多文档,接近6000 个。每个文档都有一定数量的childs(childs 是另一个集合,其中包含40000 个文档)。 parents & childs 通过文档中称为parent_id 的属性相互关联。请看下面的代码。以下代码大约需要 1 分钟来执行查询。我不认为 mongo 应该花那么多时间。

function getChildMaxDocCount(){
    var maxLen = 0;
    var bigSizeParent =  null;
    db.parents.find().forEach(function (parent){
    var currentcount = db.childs.count({parent_id:parent._id});
    if(currcount > maxLen){
        maxLen = currcount;
        bigSizeParent = parent._id;
    }
    });

    printjson({"maxLen":maxLen, "bigSizeParent":bigSizeParent });
}

是否有任何可行/最佳的方法来实现这一目标?

【问题讨论】:

  • 你在开玩笑吗?您在一分钟内对 40k 文档进行 6k 查询,甚至进行一些处理?让我们做一些数学运算:60s/6000 = 0.01s 或 10ms 每个查询。你称之为?假设您很可能甚至没有适当的索引集,我认为这令人印象深刻。

标签: mongodb query-optimization


【解决方案1】:

如果我说得对,您希望拥有最多孩子的父母。使用聚合框架很容易做到这一点。当每个孩子只能有一个父母时,聚合查询将如下所示

db.childs.aggregate(
  { $group: { _id:"$parent_id", children:{$sum:1} } },
  { $sort: { "children":-1 } },
  { $limit : 1 }
);

应该返回如下文件:

 { _id:"SomeParentId", children:15}

如果一个孩子可以有多个父母,这在很大程度上取决于数据建模查询的样子。

查看aggregation framework documentation了解详情。

编辑:一些解释

聚合管道通过一系列步骤将所有文档首先处理,然后将生成的文档放入下一步。

第 1 步:分组

我们将所有文档分组为新文档(如果需要,可以使用虚拟文档),并告诉 mongod 为每个具有相同 parent_id 的文档将字段 children 加一。由于我们引用的是当前文档的一个字段,所以我们需要添加一个$ 符号。

第 2 步:排序

现在我们有一堆文档,其中包含 parent_id 和该父级拥有的子级数量,我们按 children 字段以降序 (-1) 对其进行排序。

第三步:限制

由于我们只对拥有最多孩子的parent_id感兴趣,所以我们只让mongod返回排序后的第一个文档。

【讨论】:

  • :- 非常感谢!,我一直在寻找这样的东西。学习 mongo 中的聚合对我来说是新事物。
猜你喜欢
  • 1970-01-01
  • 2017-10-17
  • 1970-01-01
  • 1970-01-01
  • 2019-08-02
  • 1970-01-01
  • 1970-01-01
  • 2019-03-19
  • 1970-01-01
相关资源
最近更新 更多