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中计算聚合。