Мангуст объединяет данные из 2 схем - PullRequest
0 голосов
/ 13 февраля 2019

Я создаю 2 разные схемы, как показано ниже в моем коде mongoose.

    //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
    });

Он имеет схему новостей и комментариев.Каждый элемент новостей будет иметь несколько комментариев, поэтому я предоставляю идентификатор новости как часть схемы комментариев.
Когда я получаю список элементов новостей, я также хочу, чтобы первые 3 (или меньше, если доступно меньше комментариев) комментариибыть выбранным для каждой новости.

Возможно ли это с заполнением или совокупностью или их комбинацией?Или есть лучший способ справиться с этим?

1 Ответ

0 голосов
/ 20 февраля 2019

Список комментариев с первой тройкой на основе созданной даты и времени

Использование агрегации $ 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"
    },
}])
...