如何使用以下语法聚合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",
}
答案 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和路由器