在 MongoDB 中分组和计数

编程入门 行业动态 更新时间:2024-10-27 20:39:29
本文介绍了在 MongoDB 中分组和计数的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧! 问题描述

我正在尝试对 mongodb 2.0.1 中每个组的元素数量进行分组和计数,但到目前为止没有成功.

I'm trying to group and count the amount of elements for each group in mongodb 2.0.1, but with no success so far.

我的数据库架构如下所示:

My DB schema looks like :

{ "_id" : ObjectId("4ece7544853b4b0941000000"), "ResultSet" : { "Results" : [ { "quality" : 87, "state" : "Franche-Comté" } ] } }

我一直在尝试各种方法,遵循不同的教程,但每次都是相同的结果:一个唯一的空组......我不明白为什么.

I've been trying all sort of methods, following different tutorials, but it is each time the same result : an only null group... which I don't understand why.

到目前为止我写的最好的查询如下:

The best query I have written so far is the following :

db.extract_2000.group( { cond: { "ResultSet.Results.quality": {$exists: true} }, key: {"ResultSet.Results.state": true}, reduce: function(obj, glob) { glob.total++; glob.quality += obj.ResultSet.Results.quality }, initial: { total: 0, quality: 0 }, finalize: function(glob) {glob.avgquality = glob.quality / glob.total} })

返回(再次):

[ { "ResultSet.Results.state" : null, "total" : 2000, "quality" : NaN, "avgquality" : NaN } ]

我做错了什么?

推荐答案

这根本不会像写的那样工作.关键问题在这里:key: {"ResultSet.Results.state": true}.ResultSet.Results 是一个数组.当您要求 ResultSet.Results.state 时,您是在暗示某种类型的 for 循环在这里完成.group 命令根本无法做到这一点.

This simply won't work as written. The key problem is here: key: {"ResultSet.Results.state": true}. ResultSet.Results is an array. When you ask for ResultSet.Results.state you are implying some type of for loop be done here. The group command is simply not capable of this.

请尝试以下 M/R:

map = function() { // Note that we emit once per result foreach(var i in ResultSet.Results) { key = this.ResultSet.Results[i]; value = { count: 1, quality: this.ResultSet.Results[i].quality, avg_quality: 0 }; emit(key, value); } } reduce = function(key, values) { // note that results has same fields as emitted value var results = { count: 0, quality: 0, avg_quality: 0 }; foreach(var i in values){ results.count += values[i].count; results.quality += values[i].quality; // ignore avg_quality, we don't use it } return results; }

您还必须为平均值编写 finalize.

You will also have to write a finalize for the average.

finalize = function(key, value) { if (value.count > 0) value.avg_quality = value.quality / value.count; return value; }

更多推荐

在 MongoDB 中分组和计数

本文发布于:2023-11-22 08:40:59,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1616730.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:MongoDB

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!