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}
}}
])