2016-01-14 37 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);