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

Posted

技术标签:

【中文标题】从 MongoDB 和 Mongoose 中的多个文档创建单个文档【英文标题】:Create a single document from multiple documents in MongoDB and Mongoose 【发布时间】:2016-05-14 23:14:22 【问题描述】:

我对 MongoDB 和 Mongoose 很陌生,偶然发现了以下问题: 我有一个包含大约 600 个这种(缩短)格式的文档的集合:

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

文档包含范围从 0 到大约 100 的年龄值,但并非所有值都被表示。 我想以

的形式输出一个单个Object

    labels: [<Integer>, <Integer>, ...],
    data:   [<Integer>, <Integer>, ...]

其中标签是包含所有文档的所有年龄值的数组。并且数据包含找到该年龄值的次数。

我的问题是:

    由于我是数据库新手,MongoDB 甚至可以做到这一点吗?

    如果是这样,是否也可以填补标签和数据数组内部的空白?可以说,输出如下所示:

    
        labels: [0,1,2,6,9]
        data:   [1,17,4,5,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】:

我相信这就是您正在寻找的:

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"
        
    
]);

不过,我认为填充缺失值是不可能的。

【讨论】:

以上是关于从 MongoDB 和 Mongoose 中的多个文档创建单个文档的主要内容,如果未能解决你的问题,请参考以下文章

从 Mongoose/MongoDB 中的数组中删除对象

使用mongodb和mongoose(nodejs)的不同字段名称映射多个数据源

如何使用 mongodb 和 mongoose 从帖子模型中计算整体帖子活动(喜欢、不喜欢、评论)和用户模型中的参考总和

使用 Mongoose 从 Decimal128 中提取十进制 - MongoDB

更改 mongoDB/mongoose 中的模式

在多个文件中使用 Mongoose 连接到 MongoDB