Javascript MongoDB使用聚合管道统计单个用户的所有喜好和帖子

Javascript MongoDB使用聚合管道统计单个用户的所有喜好和帖子,javascript,mongodb,mongoose,Javascript,Mongodb,Mongoose,我需要一个端点,返回用户的信息,数量的帖子,他们已经提交和所有喜欢他们的帖子已经收到的总和 我正在为我的数据库使用MongoDB,为我的节点使用Mongoose 这些是我的模型: var userSchema = new Schema({ 'username' : String, 'email' : String, 'password' : String }); var photoSchema = new Schema({

我需要一个端点,返回用户的信息,数量的帖子,他们已经提交和所有喜欢他们的帖子已经收到的总和

我正在为我的数据库使用
MongoDB
,为我的
节点使用
Mongoose

这些是我的模型:

    var userSchema = new Schema({
        'username' : String,
        'email' : String,
        'password' : String
    });

    var photoSchema = new Schema({
        'text' : String,
        'path' : String,
        'timestamp': Number,
        'postedBy' : {type: Schema.Types.ObjectId, ref: "user"}
    });

    var likeSchema = new Schema({
        'timestamp' : Number,
        'photo' : {type: Schema.Types.ObjectId, ref: 'photo'},
        'user' : {type: Schema.Types.ObjectId, ref: 'user'}
    });
我已经通过使用Javascript和多个查询实现了这一点:

// Get user
let user = await userModel.findOne({_id: mongoose.Types.ObjectId(id)})
                        .select("_id, username")
                        .lean()
                        .exec();

// Get all users photos
let photos = await photoModel.find({postedBy: mongoose.Types.ObjectId(user._id)})
                        .select("_id")
                        .exec();

// Sum likes for all photos
let likes = 0;
for (let i = 0; i < photos.length; i++)
    likes += (await likeModel.find({photo: photos[i]._id}).exec()).length;
我不知道如何获得每个照片帖子的喜欢数量。是否可以在单个聚合管道中实现


使用多个聚合管道或甚至只使用多个查询来构建它是否更有意义?

如果使用
$size
来获取每个数组的大小,则不需要
展开
阶段

[
    {$match: {_id: mongoose.Types.ObjectId(id)}}, 
    {$lookup: {
               from: "photos",
               localField: "_id",
               foreignField: "postedBy",
               as: "photos"
    }}, 
    {$lookup: { 
                from: "likes",
                localField: "photos._id",
                foreignField: "photo",
                as: "likes"
    }},
    {$project: {
        likeCount: {$size:"$likes"},
        postCount: {$size:"$photos"}
    }}
]

或者,由于您从用户集合中获得的唯一字段是您已有的
\u id
,因此您可以跳过匹配和查找,直接聚合照片集合:

photoModel.aggregate([
    {$match: {postedBy: mongoose.Types.ObjectId(id)}}, 
    {$lookup: { 
                from: "likes",
                localField: "_id",
                foreignField: "photo",
                as: "likes"
    }},
    {$group: {
        _id: "$postedBy",
        likeCount: {$sum:{$size:"$likes"}},
        postCount: {$sum:1}
    }}
])

您的查询工作正常不!!。。。你能解释一下你面临的问题吗
photoModel.aggregate([
    {$match: {postedBy: mongoose.Types.ObjectId(id)}}, 
    {$lookup: { 
                from: "likes",
                localField: "_id",
                foreignField: "photo",
                as: "likes"
    }},
    {$group: {
        _id: "$postedBy",
        likeCount: {$sum:{$size:"$likes"}},
        postCount: {$sum:1}
    }}
])