我需要获取集合中某个值出现的次数,如下所示:
[
{author: 'Diego', name: 'This is a great post', date:'03/13/78'},
{author: 'Raul', name: 'Recipe for success', date:'02/03/99'},
{author: 'Diego', name: 'Having too much fun', date:'01/01/77'},
{author: 'Diego', name: 'Another post by me', date:'10/9/99'},
{author: 'Diego', name: 'Mi first post', date:'01/01/73'},
{author: 'Mariano', name: 'Mi best post', date:'01/01/95'},
]
我想要返回的水线 find() 参数:
[
{author: 'Diego', count: 4, date: '01/01/73'},
{author: 'Raul', count: 1, date: '02/03/09'}
]
到目前为止,我能够获得除计数以外的所有内容,如下所示:
Model.find({
where: {author: {'!': 'Mariano'}},
groupBy: ['author'],
min: ['date']
// and count?!?!?!
}).exec(function(err, items) {
//do something with items.
});
我试过“sum:['1']”,但这只给了我一个名为“1”的属性,每个结果行中的值为0。
最佳答案
使用node.js mongo DB native的聚合方法
documentation
我的代码中的示例:
select count from order where restaurant ID = ... GROUP BY createdAt ISO DATE BY its first 10 chars - days (2015-01-10)
if(restaurantsFound.length > 0) {
var result = [],
Q = require('q'),
promises = [];
for(var r in restaurantsFound) {
promises[r] = (function () {
var deferred = Q.defer();
Order.native(function(err, collection) {
if (err) {
console.error(err);
deferred.reject(err);
}
var ObjectID = require('mongodb').ObjectID;
var restaurantId = new ObjectID(restaurantsFound[r]);
collection.aggregate([
{ $match : {
restaurant : restaurantId
}},
{ $group : {
_id : {"_id":{"$substr":["$createdAt", 0, 10]}},
count : { $sum : 1 },
restaurant: {$addToSet: "$restaurant"}
}}
], function(err, result) {
deferred.resolve(result);
});
});
return deferred.promise;
})();
}
Q
.allSettled(promises)
.then(function(data) {
var result = [];
for(var k in data) {
result[k] = [];
for(var l in data[k].value) {
result[k].push({
restaurant: data[k].value[l].restaurant[0].toString(),
count: data[k].value[l].count,
date: data[k].value[l]._id._id
});
}
}
return res.ok(result);
}).catch(function(error) {
console.error(error.message);
return res.badRequest({message: error.message});
});
}
关于sails.js - 使用sails-mongo在水线上计数分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32822551/