我在猫鼬代码中创建了2种不同的模式,如下所示。
//News Schema
var newsSchema = mongoose.Schema({
link: { type: String, index: {unique: true, dropDups: true}, required: 'Kindly enter the link of the news' },
description: { type: String, required: 'Kindly enter the description of the news' }
});
//Comment Schema
var commentSchema = mongoose.Schema({
text: { type: String, required: 'Kindly enter the comment text'},
newsId: { type: mongoose.Schema.Types.ObjectId, ref: "News", required: 'Provide the news ID to which this comment belongs' }
},
{
timestamps: true
});
它具有新闻和评论架构。每个新闻项目都将有多个评论,因此,我将在评论架构中提供新闻ID。
当我获取新闻条目列表时,我还希望为每个新闻条目获取前3条(或更少,如果可用的评论较少)。
是否可以使用填充或聚集或它们的组合?还是有更好的方法来处理它?</ p>
答案 0 :(得分:0)
基于创建的日期和时间的前三名评论列表
使用聚合$group根据newsId
对文档进行分组,然后使用$slice控制数组中的项目数。
db.comment.aggregate([
{ '$sort': { 'createdAt': 1 } }, //Where timestamps is true
{
'$group': {
'_id': '$newsId',
'docs': { '$push': '$$ROOT' },
}
},
{
'$project': {
'top_three': {
'$slice': ['$docs', 3]
}
}
}
])
新闻列表,每个新闻带有3条评论
db.news.aggregate([{
$lookup: {
from: "comments",
let: { news: "$_id" },
pipeline: [
{ $match: { "$expr": { "$eq": ["$newsId", "$$news"] } } },
{ '$sort': { 'createdAt': 1 } },
{ $limit: 3 }
],
as: "comments"
},
}])