nodejs中的Mongoose聚合

时间:2016-06-06 03:47:41

标签: node.js mongoose

如何使用以下语法聚合monggose

我想按照' aptType'对结果进行分组。和' aptStatus'并在分组后得到每个的计数。

router.route('/api/apartments/getstats')             
    .get(function(req, res) {
        Apartment.find({$group:{_id:{'aptType':'$aptType','aptStatus':'$aptStatus'},count:{$sum:1}}},function(err, apartments) {
            if (err)
                res.send(err);

            res.json(apartments);
         });
   });

下面是mongoose Schema

var mongoose = require('mongoose');
var Schema = mongoose.Schema;

var ApartmentSchema = new Schema({
    BusinessUnit:String,
    aptID: String,
    aptType: String,    
    aptStatus: String,
 });

module.exports = mongoose.model('Apartment', ApartmentSchema);    

文件样本如下

{
    "_id": {
        "$oid": "5754cec6dcba0f2aab5c0bca"
    },
    "aptID": "402",
    "aptType": "1BHK",
    "aptStatus": "Available",
    "BusinessUnit": "Business Unit One", 
}

{
    "_id": {
        "$oid": "5754cec6dcba0f2aab5c0bca"
    },
    "aptID": "402",
    "aptType": "1BHK",
    "aptStatus": "Not-Available",
    "BusinessUnit": "Business Unit One", 
}

{
    "_id": {
        "$oid": "5754cec6dcba0f2aab5c0bca"
    },
    "aptID": "402",
    "aptType": "2BHK",
    "aptStatus": "Not-Available",
    "BusinessUnit": "Business Unit One", 
}

{
    "_id": {
        "$oid": "5754cec6dcba0f2aab5c0bca"
    },
    "aptID": "402",
    "aptType": "2BHK",
    "aptStatus": "Available",
    "BusinessUnit": "Business Unit One", 
}

1 个答案:

答案 0 :(得分:0)

实际上是聚合查询:

{$group:{_id:{'aptType':'$aptType','aptStatus':'$aptStatus'},count:{$sum:1}}}

是正确的,如果你想得到下一个结果(按两者分组:aptType和aptStatus):

[ { _id: { aptType: '2BHK', aptStatus: 'Available' }, count: 1 },
  { _id: { aptType: '1BHK', aptStatus: 'Available' }, count: 1 },
  { _id: { aptType: '2BHK', aptStatus: 'Not-Available' }, count: 1 },
  { _id: { aptType: '1BHK', aptStatus: 'Not-Available' }, count: 1 } ]

问题是您需要使用Apartment.aggregate而不是Apartment.find

<强>更新

以下是完整的工作示例:

let express = require('express');
let mongoose = require('mongoose');
let app = express();
let router = express.Router();

const MONGO_URI = 'mongodb://localhost/test';
const PORT = 8888;

mongoose.connect(MONGO_URI);
mongoose.connection.once('open', () => {
    console.log(`Connected to ${MONGO_URI}`);
});

let Schema = mongoose.Schema;
let ApartmentSchema = new Schema({
    BusinessUnit: String,
    aptID: String,
    aptType: String,
    aptStatus: String
});

let Apartment = mongoose.model('Apartment', ApartmentSchema);

router.route('/api/apartments/getstats')
    .get(function(req, res) {
        Apartment.aggregate({$group:{_id:{'aptType':'$aptType','aptStatus':'$aptStatus'},count:{$sum:1}}},function(err,  apartments) {
            if (err) res.send(err);
            res.json(apartments);
        });
    });

app.use(router);

app.listen(PORT, () => {
    console.log(`Listening on port ${PORT}`);
});

好的做法是将此代码拆分为服务器,dbmodel和路由器