在mongoose上自定义json输出

时间:2016-01-14 16:14:52

标签: json mongodb express mongoose mean-stack

我是mongoose和mongoDB的新手,我已经能够通过模型从查询中获得json响应。但是,我想知道如何使用mongoose从多个查询中获取自定义json输出。我目前编写的代码如下。



var ArticleSchema = new Schema({
  title: {
    type: String,
    default: ''
  },
  content: {
    type: String,
    default: ''
  }
});

mongoose.model('Article', ArticleSchema);


exports.list = function (req, res) {
  Article.find().exec(function (err, articles) {
    if (err) {
      return res.status(400).send({
        message: errorHandler.getErrorMessage(err)
      });
    } else {
      res.json(articles);
    }
  });
};



输出是

{
    [
        {
            "title": "Super Hero 1",
            "content": "Superman"
        },
        {
            "title": "Super Hero 2",
            "content": "Batman"
        },
        ...
    ]
}

现在假设我想生成json如下,怎么可能呢?

{
     "totalCount": 50, //total count of the query
     "data":  [
            {
                "title": "Super Hero 1",
                "content": "Superman"
            },
            {
                "title": "Super Hero 2",
                "content": "Batman"
            },
            ...
        ]
    }

2 个答案:

答案 0 :(得分:2)

您可以将 aggregation framework 与以下渠道一起使用:

exports.list = function (req, res) {
    var pipeline = [
        {
            "$group": {
                "_id": null,
                "data": {
                    "$push": {
                        "title": "$title",
                        "content": "$content"
                    }
                },
                "totalCount": { "$sum": 1 }
            }
        },
        {
            "$project": {
                "_id": 0, "totalCount": 1, "data": 1
            }
        }
    ];

    Article.aggregate(pipeline).exec(function (err, articles) {
        if (err) {
            return res.status(400).send({
                message: errorHandler.getErrorMessage(err)
            });
        } else {
            res.json(articles);
        }
    });
};

管道的结构使您的第一步 $group 管道阶段尝试对数据进行分组以处理它们。 $group 管道运算符类似于SQL的GROUP BY子句。在您的情况下,您按键提供具有_id值的组,空值表示您正在对集合中的所有文档进行分组。

同样在SQL中,除非使用任何聚合函数,否则不能使用GROUP BY。同样,您也必须在MongoDB中使用聚合函数。在这种情况下,您需要 $push 运算符来创建data数组。然后使用 $sum 运算符累积其他字段totalCount

使用 $project 运算符的最后一步涉及更改最终文档的属性,以便删除_id字段。

答案 1 :(得分:0)

如果你只是需要构建一个响应,这将是最简单的方法。

var newResp = [{ "totalCount": listings.length , "data": listings }];

res.json(newResp);