选择sailsJs的问题?

时间:2014-12-18 12:35:00

标签: node.js sails.js

我遇到了sailsJs的问题 我想选择所有的消息数,组+属于当前组的消息数, 我的代码就像这样

Group.find().exec(function (err, groups) {
    if (err)
        return next(err);
    _.each(groups, function (grouper) {
        Messages.find({
            groupId : grouper.id,
        }).exec(function (err, somethingfunctions) {
            console.log(groups),
            console.log(somethingfunctions.length),
        });
    });
});

我想要这样的想法

组名+属于当前组的邮件数; 例如

webdevelopment - 34 messages

我无法理解如何使用sailsJs

执行此操作

2 个答案:

答案 0 :(得分:0)

使用为count models提供的_.each(groups, function (grouper)方法,如下所示:

Messages
.count({groupId : grouper.id})
.exec(function (err, found) {
  if(!err) console.log(grouper.name + ' - ' + found + ' messages.');
});

但是,有更好的方法可以做到这一点。您正在为每个groupId运行一次查询(不是很好!),当您可以在一个Native查询中获得结果时!

Messages.native(function (err, MessageCollecion){
  MessageCollecion.aggregate(
    { $group: 
      { _id: '$groupId', total_messages: { $sum: 1 } } 
    },
    function (err, res) {
      if (!err) console.log(res);
    });
});

这将为您groupId而不是group name。因此,您可以为所有组查询一次,然后从ID中获取名称。尽管如此,2 queries比每个groupId查询一次更好。

答案 1 :(得分:0)

另一种方法:

var async = require('async');  // npm install async before running Sails

Group.find().exec(function (err, groups) {
    if (err) {
        return next(err);
    }
    // Create a group of async tasks
    var tasks = {};

    _.each(groups, function (group) {
        // For each group, create a task. This task will execute Message.count()
        // for the specified group. Once done, the task will pass on its results
        // to a callback. The task is NOT started right away.
        tasks[group.name] = (function(_groupId) {
            return function(callback) {
                Messages.count({groupId: _groupId}).exec(callback);
            }
        })(group.id);
    });

    // Now start the tasks, executing them in sequence, one after the other.
    // At the end, the callback passed to async.series() gets an aggregate
    // of all the individual tasks' results in its results parameter.
    async.series( tasks, function( err, results ) {
        // send the results as JSON.
        res.json( results );
    } );

});

希望这会有所帮助。另一种方法(更简单)是定义模型之间的关联。例如。在api/models/Group.js

// Group model
module.exports = {
    attributes: {
        ...,
        messages : { collection: 'Messages', via: 'group' },
        ...
    }
};

api/models/Messages.js

// Messages model
module.exports = {
    attributes: {
        ...,
        group : { model: 'Group' },
        ...
    }
};

然后,您可以使用查询将组及其关联的消息作为填充值,请参阅Waterline reference - populated values

Group.find()
.populate('messages')  // a "collection" association
.exec(function (err, groups){
    // Now each group in groups has a populated messages attribute
});