我遇到了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
执行此操作答案 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
});