Node.js 猫鼬计算平均数
我得到了以下猫鼬模型:Node.js 猫鼬计算平均数,node.js,mongodb,Node.js,Mongodb,我得到了以下猫鼬模型: var MobileAppSchema = mongoose.Schema({ identifier: String, ... }); var RecordingSchema = mongoose.Schema({ ... , app: { type: mongoose.Schema.Types.ObjectId, ref: 'MobileApp' }, length: Number, ... }); 现在我得到一些
var MobileAppSchema = mongoose.Schema({
identifier: String,
...
});
var RecordingSchema = mongoose.Schema({
... ,
app: {
type: mongoose.Schema.Types.ObjectId,
ref: 'MobileApp'
},
length: Number,
...
});
现在我得到一些MobileAppSchema的记录,我想得到所有RecordingSchema,其中Recording.app等于我的一个MobileApps。对于所有获取的文档,我希望获得Recording.length的平均值
我目前的方法是有效的,但是我希望直接使用mongoose查询进行聚合,而不是事后聚合
目前的执行情况:
exports.averageTimeSpentForAppIdentifier = function(appIdentifier, done) {
mobileAppsForAppIdentifier(appIdentifier, function(err, mobileApps) {
if(err) {
return done(err);
}
var appIds = mobileApps.map(function(mobileApp) {return mobileApp._id;});
Recording.find({
'app': { $in: appIds}}, function(err, recordings) {
if(err) {
return done(err);
}
if(!recordings || recordings.length == 0) {
return done(null, 0);
}
var average = recordings
.map(function(recording,i,arr) {
return recording.length/arr.length
})
.reduce(function(a,b) {
return a + b
});
done(null, average);
});
});
};
聚合框架可以在这里使用。运行以下管道将获得所需的结果。它使用管道作为过滤进入聚合的文档的初始步骤 不符合mobileApps ID给定标准的管道 下面的运算符用于主聚合,即使用累加器运算符计算分组文档的平均长度:
exports.averageTimeSpentForAppIdentifier = function(appIdentifier, done) {
mobileAppsForAppIdentifier(appIdentifier, function(err, mobileApps) {
if(err) {
return done(err);
}
var appIds = mobileApps.map(function(mobileApp) {return mobileApp._id;}),
pipeline = [
{"$match": { "app": { $in: appIds } } },
{
"$group": {
"_id": null,
"average": { "$avg": "$length" }
}
}
];
Recording.aggregate(pipeline)
.exec(function (err, result){
if(err) {
return done(err);
}
done(null, result[0].average);
})
// Or using the fluent pipeline builder API
Recording.aggregate()
.match({ "app": { $in: appIds } })
.group({ "_id": null, "average": { "$avg": "$length" }})
.exec(function (err, result){
if(err) {
return done(err);
}
done(null, result[0].average);
});
});
};
聚合框架可以在这里使用。运行以下管道将获得所需的结果。它使用管道作为过滤进入聚合的文档的初始步骤 不符合mobileApps ID给定标准的管道 下面的运算符用于主聚合,即使用累加器运算符计算分组文档的平均长度:
exports.averageTimeSpentForAppIdentifier = function(appIdentifier, done) {
mobileAppsForAppIdentifier(appIdentifier, function(err, mobileApps) {
if(err) {
return done(err);
}
var appIds = mobileApps.map(function(mobileApp) {return mobileApp._id;}),
pipeline = [
{"$match": { "app": { $in: appIds } } },
{
"$group": {
"_id": null,
"average": { "$avg": "$length" }
}
}
];
Recording.aggregate(pipeline)
.exec(function (err, result){
if(err) {
return done(err);
}
done(null, result[0].average);
})
// Or using the fluent pipeline builder API
Recording.aggregate()
.match({ "app": { $in: appIds } })
.group({ "_id": null, "average": { "$avg": "$length" }})
.exec(function (err, result){
if(err) {
return done(err);
}
done(null, result[0].average);
});
});
};
你的问题是什么?因为即使是一个简单的搜索也会得到大量的结果来解释如何在mongodb中计算聚合?因为即使是一个简单的搜索也会找到大量的结果来解释如何在mongodb中计算聚合。