2015-03-06 3 views
2

У меня есть такой «комментарий» модель:MongoDB - агрегатный внедренный идентификатор документа перезаписать внешний документ _id

{ _id: <comment-id>, 
    user: { 
    id: { type: Schema.ObjectId, ref: 'User', required: true }, 
    name: String 
    }, 
    sharedToUsers:   [{ type: Schema.ObjectId, ref: 'User' }], 
    repliedToUsers:   [{ type: Schema.ObjectId, ref: 'User' }], 
} 

И я хочу, чтобы запросить все комментарии, которые проходят следующие условия:

  1. sharedToUsers массив пуст
  2. repliedToUsers массив пуст

Но также, я ж ant результат должен содержать только 1 комментарий (последний комментарий) для пользователя по идентификатору пользователя.

Я попытался создать эту совокупность (Node.js, мангуст):

 Comment.aggregate(
     { $match: { "sharedToUsers": [], "repliedToUsers": [] } }, 
     { 
      $group: { 
       _id: "$user.id", 
       user: { $first: "$user" }, 
      } 
     }, 
     function (err, result) { 
      console.log(result); 
      if (!err) { 
       res.send(result); 
      } else { 
       res.status(500).send({err: err}); 
      } 
     }); 

Это на самом деле работает, но серьезная проблема заключается в том, что результаты комментарии _id поле перезаписана вложенной пользователем _Я бы.

Как сохранить работоспособность агрегата, но не перезаписывать исходное поле _ID комментария?

Thanks

+2

Нажмите комментарий '_id' в результаты группы, как вы делали с' user', например. 'comment_id: {" $ first ":" $ _id "}'. – wdberkeley

ответ

3

Хорошо, у меня есть решение.

Все, что я хотел, это группировать _id, но возвращать результирующие документы со своим полем _id (которое было перезаписано при использовании оператора $ group).

Что я сделал, как wdberkley сказал, я добавил comment_id: {"$ first": "$ _id"}, но тогда я не хотел возвращать поле comment_id (потому что он не соответствует моей модели), поэтому Я создал проект $, который помещает comment_id в регулярное поле _id.

Это в основном, как это выглядит:

Comment.aggregate(
     { 
      $match: { 
       "sharedToUsers": [], "repliedToUsers": [] 
      } 
     }, 
     { 
      $group: { 
       comment_id: { $last: "$_id" }, 
       _id: "$user.id", 
       content: { $last: "$content" }, 
       urlId: { $last: "$urlId" }, 
       user: { $last: "$user" } 
      } 
     }, 
     { 
      $project: { 
       _id: "$comment_id", 
       content: "$content", 
       urlId: "$urlId", 
       user: "$user" 
      } 
     }, 
     { $skip: parsedFromIndex }, 
     { $limit: (parsedNumOfComments - parsedFromIndex) }, 
     function (err, result) { 
      console.log(result); 
      if (!err) { 
       Comment.populate(result, { path: "urlId"}, function(err, comments) { 
        if (!err) { 
         res.send(comments); 
        } else { 
         res.status(500).send({err: err}); 
        } 
       }); 
      } else { 
       res.status(500).send({err: err}); 
      } 
     }); 

благодаря wdbkerkley!

Смежные вопросы