如何在MongoDB中创建嵌套组?

时间:2013-01-14 23:22:51

标签: mongodb

假设Mongo中有数据!有一些项目,还有管理者,分配问题的人。由于项目具有不同的部分,因此每个问题都分配给不同的人。 如何计算数字,每个受让人都已在项目中分配。 例如:

{
    "Project A": {
            "Ted":10,
            "Matt":5
            },
    "Project B": {
            "Mary":3,
            "Hector":30
            }
}

以下内容写入总和,但不对其进行分组:

db.test.issues.group({
    "key": {
        "project": true
        "assignee":true
    },
    "initial": {
        "countassignee": 0
    },
    "reduce": function(obj, prev) {
        prev.countassignee++;
    }
});

它将返回:

{
{
"project": "Project A",
"countassignee":10,
"assignee":"Ted" 
}
....
}

2 个答案:

答案 0 :(得分:0)

您提供的数据样本非常令人困惑。它的项目A和项目B应该是不同的文件。 我相信群组的最佳用途是在群集中进行分类,如果你想在doucment中计算,你可以使用javascript。

答案 1 :(得分:0)

OK!它似乎不是最好的答案,但它会做到! 首先定义一个按项目排序的游标

var cursor = db.test.find().sort({projects:1});

柜台清单:

var asgn_nums = {};

和保存项目名称的变量;:

var project = '0';

这里计算每个项目:

while (cursor.hasNext()) {
    var issue = cursor.next();
    var p = issue.project;
    if(p != project)
    {
        if(project != '0'){
            print(project+":");
            printjson(asgn_nums);
        }
        project = p;
        asgn_nums = {};
    }
    if(issue.assignee != null)
    {
        if (asgn_nums[issue.assignee] == null)
            asgn_nums[issue.assignee] = 1;
        else
            asgn_nums[issue.assignee]+= 1;
    }
    if(!cursor.hasNext())
    {
        print(project+":");
        printjson(asgn_nums);
    }
}