2016-11-15 5 views
0

С схемойPopulate ограниченного количества элементов в массиве, но сохранить размер массива - мангуст

var CommentSchema = new Schema({ 
    text: { type: String }, 
    replies: [{ type: mongoose.Schema.ObjectId, ref: 'Comment' }] 
}); 

У меня есть запрос, как

Comment.findById(req.params.id) 
    .populate({ 
    path: 'replies', 
    model: 'Comment', 
    options: { 
     limit: 2 
    } 
    }) 
    .exec(...) 

Теперь я не вижу варианта не заполнить ограниченное число элементов в массиве и сохраняют длину массива.

Я думал о заселении в другое «целевое» поле, так что исходный массив ответов остается нетронутым (и, следовательно, информацией о количестве ответов). Но я думаю, что этот вариант не существует в mongoose populate().

прецедент можно посмотреть по телефону Youtube комментарии. Комментарий содержит количество ответов, но отображает только ограниченное число из них.

ответ

1

Я использовал следующий трюк, чтобы справиться с этой ситуацией.

var idToSearch = mongoose.Types.ObjectId(req.params.id) 

var aggregation = [ 
    {$match : {_id : idToSearch}}, 
    {$project : { 
     _id : 1, 
     replies: {$slice : ['$replies',5]}, 
     totalreplies : {$size : "$replies"}, 
    }} 
    ]; 
models.Comment.aggregate(aggregation) 
    .exec(function(err, comments) { 
     if(err){ 
     // return error 
     } 
     else if(!comments){ 
     // return data not found 
     }else { 
     models.Comment.populate(comments, 
      { path: 'replies'}, 
      function(err, populatedComments){ 
      if(err){ 
       // return error 
      } 
      else { 
       console.log('comments ',populatedComments); 
      } 
      }); 
     } 
    }); 

Надеется, что это помогает

+0

Спасибо за быстрый ответ. Я вижу, как работает ваше решение, но я не получаю агрегат для работы. Я опубликовал другой вопрос SO: http://stackoverflow.com/questions/40636434/aggregate-returns-empty-array-mongoose – Stefan