sails.js - 使用sails-mongo在水线上计数分组

标签 sails.js waterline sails-mongo

我需要获取集合中某个值出现的次数,如下所示:

[
    {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/

相关文章:

orm - 在 Sails Controller 中的操作之前

node.js - 如何在 Controller 外部访问 sailsjs 中的模型?

javascript - 如何在生产服务器上测试、调试和查看 Node js 应用程序的控制台日志消息

node.js - Sails mongo 重新连接

node.js - sails.js 异步问题

javascript - 无法进入异步(同步)函数/空结果的回调

mysql - 如何在 Waterline sails.js 中使用其同事的属性查找实体?

node.js - 如何使用 sailsjs 在 MongoDb 中存储和检索图像?

node.js - 多字段传递获取查询失败

javascript - SailsJS/水线 ORM : Update multiple entries using only one query