gpt4 book ai didi

mongodb - Mongo - 选择具有最大子文档数的父文档,更快的方法?

转载 作者:可可西里 更新时间:2023-11-01 09:59:08 25 4
gpt4 key购买 nike

我是 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 });
}

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

最佳答案

如果我没看错,您希望拥有最多 child 的 parent 。使用聚合框架很容易实现这一点。当每个 child 只能有一个 parent 时,聚合查询看起来像这样

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

应该返回如下文档:

 { _id:"SomeParentId", children:15}

如果一个 child 可以有多个 parent ,这在很大程度上取决于查询的数据建模方式。

看看 aggregation framework documentation了解详情。

编辑:一些解释

聚合管道将它被告知的每个文档通过一系列步骤执行,所有文档首先通过第一步处理,并将生成的文档放入下一步。

第 1 步:分组

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

第 2 步:排序

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

第三步:限制

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

关于mongodb - Mongo - 选择具有最大子文档数的父文档,更快的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26972703/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com