首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >MongoDB 2.1与名称匹配的数组元素的聚合框架和

MongoDB 2.1与名称匹配的数组元素的聚合框架和
EN

Stack Overflow用户
提问于 2012-08-28 23:32:48
回答 1查看 10.1K关注 0票数 17

这是一个关于在数组中添加一系列数据的最佳方法的问题,在该数组中,我必须匹配另一个元素。我正在尝试使用2.2聚合框架,我可以用一个简单的组来做到这一点。

因此,对于给定的一组文档,我尝试得到如下输出;

{
    "result" : [
            {
                "_id" : null,
                "numberOf": 2,
                "Sales" : 468000,
                "profit" : 246246,
            }
    ],
    "ok" : 1
}

现在,我最初有一个文档列表,其中包含分配给命名属性的值,例如;

[
{
    _id : 1,
    finance: {
        sales: 234000,
        profit: 123123,
    }
}
,
{
    _id : 2,
    finance: {
        sales: 234000,
        profit: 123123,
    }
}
]

这很容易加起来,但是由于其他原因,这个结构不能工作。例如,可能还有像"finance“这样的其他列,我希望能够在不创建数千个索引的情况下对它们进行索引,因此我需要转换为这样的结构;

[
{
    _id : 1,
    finance: [
        {
            "k": "sales",
            "v": {
                "description":"sales over the year",
                v: 234000,
            }
        },
        {
            "k": "profit",
            "v": {
                "description":"money made from sales",
                v: 123123,
            }
        }
    ]
}
,
{
    _id : 2,
    finance: [
        {
            "k": "sales",
            "v": {
                "description":"sales over the year",
                v: 234000,
            }
        },
        {
            "k": "profit",
            "v": {
                "description": "money made from sales",
                v: 123123,
            }
        }
    ]
}
]

如果需要,我可以对finance.k进行索引,但是我很难构建一个聚合查询来将匹配特定键的所有数字相加。这就是我最初选择命名属性的原因,但这确实需要在有数千个"k“标签的情况下工作。

有人知道如何使用新框架为此构建聚合查询吗?我已经试过了;

db.projects.aggregate([
    {
        $match: {
            // QUERY
            $and: [
                // main query
                {},
            ]
        }
    },
    {
        $group: {
            _id: null,
            "numberOf": { $sum: 1 },
            "sales":    { $sum: "$finance.v.v" },
            "profit":   { $sum: "$finance.v.v" },
        }
    },
])

但是我得到了;

{
    "errmsg" : "exception: can't convert from BSON type Array to double",
    "code" : 16005,
    "ok" : 0
}

**为了获得额外的荣誉,我还需要能够在MapReduce查询中做到这一点。

EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12162681

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档