gpt4 book ai didi

mongodb - 如何使用 php 计算 mongo 集合中的文档元素?

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

我有一个 mongo 文档的以下结构:

{
"_id": ObjectId("4fba2558a0787e53320027eb"),
"replies": {
"0": {
"email": ObjectId("4fb89a181b3129fe2d000000"),
"sentDate": "2012-05-21T11: 22: 01.418Z"
}
"1": {
"email": ObjectId("4fb89a181b3129fe2d000000"),
"sentDate": "2012-05-21T11: 22: 01.418Z"
}
"2" ....
}

}

如何计算集合中所有文档的所有回复?谢谢!

最佳答案

在下面的回答中,我使用了一个简单的数据集,整个集合中有五个回复:

> db.foo.find()
{ "_id" : ObjectId("4fba6b0c7c32e336fc6fd7d2"), "replies" : [ 1, 2, 3 ] }
{ "_id" : ObjectId("4fba6b157c32e336fc6fd7d3"), "replies" : [ 1, 2 ] }

因为我们不是简单地计算文档,db.collection.count()不会在这里帮助我们。我们需要求助于 MapReduce扫描每个文档并聚合回复数组的长度。请考虑以下事项:

db.foo.mapReduce(
function() { emit('totalReplies', { count: this.replies.length }); },
function(key, values) {
var result = { count: 0 };
values.forEach(function(value) {
result.count += value.count;
});
return result;
},
{ out: { inline: 1 }}
);

map 函数(第一个参数)遍历整个集合,并在常量键下发出每个文档中的回复数。然后 Mongo 将考虑所有发出的值并多次运行 reduce 函数(第二个参数)以合并(字面上减少)结果。希望这里的代码简单明了。如果您是 map/reduce 的新手,需要注意的是 reduce 方法必须能够处理自己的输出。这在上面链接的 MapReduce 文档中有详细解释。

注意:如果你的集合比较大,你可能需要使用另一种输出方式(例如集合输出);但是,inline 适用于小型数据集。

最后,如果您使用的是 MongoDB 2.1+,我们可以利用 Aggregation Framework避免编写 JS 函数并使这更容易:

db.foo.aggregate(
{ $project: { replies: 1 }},
{ $unwind: "$replies" },
{ $group: {
_id: "result",
totalReplies: { $sum: 1 }
}}
);

这里发生了三件事。首先,我们告诉 Mongo 我们对 replies 字段感兴趣。其次,我们想要展开数组,以便我们可以遍历投影中各个字段的所有元素。最后,我们将在“结果”桶(任何常数都可以)下汇总结果,将 1 添加到每次迭代的 totalReplies 结果中。执行此查询将产生以下结果:

{
"result" : [{
"_id" : "result",
"totalReplies" : 5
}],
"ok" : 1
}

虽然我写的上述答案是针对 Mongo 客户端的,但将它们翻译成 PHP 应该没有问题。您需要使用 MongoDB::command()运行 MapReduce 或聚合查询,因为 PHP 驱动程序目前没有任何辅助方法。 PHP 文档中目前有一个 MapReduce 示例,您可以引用 this Google group post通过相同的方法执行聚合查询。

关于mongodb - 如何使用 php 计算 mongo 集合中的文档元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10687650/

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