从MongoDB和Mongoose中的多个文档创建单个文档

时间:2016-05-14 23:14:22

标签: javascript node.js mongodb mongoose

我对MongoDB和Mongoose很新,偶然发现以下问题: 我收集了大约600份此(缩短)格式的文件:

{ 
    _id: ObjectId(<Integer>),
    sA: [
        {
            age: {
                value: <Integer>
            }
        }
    ]
}

文档包含0到100左右的年龄值,但并非所有值都被表示。 我想以

的形式输出一个单个对象
{
    labels: [<Integer>, <Integer>, ...],
    data:   [<Integer>, <Integer>, ...]
}

其中labels是一个包含所有文档的所有年龄值的数组。数据包含找到年龄值的次数。

我的问题是:

  1. 由于我是数据库新手,MongoDB甚至可以实现这一点吗?
  2. 如果是这样,是否也可以填补标签和数据阵列中的空白?可以说,输出看起来像这样:

    {
        labels: [0,1,2,6,9]
        data:   [1,17,4,5,3]
    }
    
  3. 但我希望它看起来像这样:

    {
        labels: [0,1,2,3,4,5,6,7,8,9],
        data:   [1,17,4,0,0,0,5,0,0,3]
    }
    

    到目前为止,我还无法使用聚合或mapReduce管道存档此格式。我必须分两步完成吗?就像输出一个排序数组然后在服务器上使用Javascript函数来提取和填充数据和标签数组并在将对象发送回客户端之前填补空白?

    提前谢谢!!

1 个答案:

答案 0 :(得分:2)

我相信这就是你要找的东西:

db.collection.aggregate([
    { $unwind: "$sA" },
    { $group: {
        _id: "$sA.age.value",
        count: {$sum: 1}
    } },
    { $sort: {
        _id: 1
    }},
    { $group: {
        _id: null,
        labels: {
            $push: "$_id"
        },
        data: {
            $push: "$count"
        }
    }}
]);

我不相信填写缺失值是可能的。