猫鼬结合了两种模式的数据

时间:2019-02-13 10:10:25

标签: mongoose mongoose-schema mongoose-populate

我在猫鼬代码中创建了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>

1 个答案:

答案 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条评论

$lookup$limit使用聚合

db.news.aggregate([{
    $lookup: {
        from: "comments",
        let: { news: "$_id" },
        pipeline: [
            { $match: { "$expr": { "$eq": ["$newsId", "$$news"] } } },
            { '$sort': { 'createdAt': 1 } },
            { $limit: 3 }
        ],
        as: "comments"
    },
}])