2017-02-23 45 views
1

Постараюсь объяснить данные образца. Пользователь может делать любые отзывы, но я хочу только вернуть последний отзыв.Найти все документы, но если некоторые документы имеют одинаковое значение, получите последнюю версию

{ 
    id : 1 
    name : "John", 
    review : "only one review" 
    dateCreated : 2017-02-23 02:35:11.420Z 
} 
{ 
    id : 3 
    name : "Sam" 
    review : "second entered" 
    dateCreated : 2017-02-23 02:41:42.300Z 
} 
{ 
    id : 2 
    name : "Sam", 
    review : "fist enterd" 
    dateCreated : 2017-02-23 02:36:32.150Z 
} 

.find() должен возвращать документы с идентификатором 1 и идентификатором 3. Поскольку существует только один из Иоанна и один с идентификатором 3 был последним из Сэм.

Есть ли запрос на это?

Мой фактический проект сложнее, потому что вместо name У меня есть userId и anonId. Эти поля имеют значения, которые являются объектами Ids. и самая сложная часть состоит в том, что документ не содержит обоих. Либо он содержит userId, либо anonId

Так что, я думаю, мне понадобится условие или состояние. anonId или userId

Возможно, вы тоже можете дать мне представление об этом.

EDIT:

мой фактические данные больше похоже на это. Это сложнее.

{ 
    anonId : ObjectId("58ae4f934a7d2b2490e8f99c") 
    review : review made by an anoymous user 
    dateCreated : 2017-02-23 02:35:11.420Z 
} 
{ 
    anonId : ObjectId("58ae4f934a7d2b2490e8f99c") 
    review : second review made by anonymous user 
    dateCreated : 2017-02-23 05:35:11.420Z 
} 
{ 
    userId : ObjectId("58ae4a5f4a7d2b2490e8f996") 
    review : first review made by authenticated user 
    dateCreated : 2017-02-22 05:35:11.420Z 
} 
{ 
    userId : ObjectId("58ae4a5f4a7d2b2490e8f996") 
    review : second review made by authenticated user 
    dateCreated : 2017-02-25 05:35:11.420Z 
} 

{ 
    userId : ObjectId("58ae5fc7a467cf23947833c8") 
    review : This will be returened because no other review has this userID 
    dateCreated : 2017-02-25 05:35:11.420Z 
} 

ответ

1

Вы можете выполнить нисходящая $sort на dateCreated и $group по userId или anonId:

db.test.aggregate([{ 
    $sort: { 
     "dateCreated": -1 
    } 
}, { 
    $project: { 
     ref: { 
      $cond: { 
       if: { $gt: ["$userId", null] }, 
       then: "$userId", 
       else: "$anonId" 
      } 
     }, 
     document: "$$ROOT" 
    } 
}, { 
    $group: { 
     _id: "$ref", 
     document: { 
      "$first": "$document" 
     } 
    } 
}]) 

Заметим, что условие используется в $project стадии, чтобы проверить, если userId существует еще набор ref для anonId

Here является признаком

+0

хорошо говорит, что у меня 20 полей/дорожек. Я должен получить первый из них для всех из них –

+0

Я обновил ваш реальный usecase (с 'userId' и' anonId') и используя '$$ ROOT' в качестве вложенного документа для ухода за всеми вашими полями –

+0

Я думаю, что это затрудняет заполнение полей 'userId'' anonId'. я могу заполнить после этого? Спасибо за Ваш ответ. –

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

  • Нет связанных вопросов^_^