2016-01-14 36 views
1

我是mongoose和mongoDB的新手,我已经能够通过模型查询得到json响应。但是,我想知道如何使用猫鼬从多个查询中获得自定义json输出。目前我写的代码如下。在猫鼬上定制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

你可以用下面的管道使用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流水线阶段试图对数据进行分组的方式结构来处理它们。管道运算符类似于SQL的GROUP BY子句。在你的情况下,你通过_id值的键提供组,并且空值表示你正在对该集合中的所有文档进行分组。

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

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

+1

很好的解释。将更多地关注聚合框架。非常感谢。 – stackdisplay

+0

@stackdisplay不用担心,高兴地帮助:) – chridam

0

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

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

res.json(newResp);