2016-10-11 3 views
0

У меня есть простая реализация социальной сети с MongoDB. Моя схема выглядит следующим образом:Запрос социальной сети с MongoDB

User 
    _id 
    name 

Friend 
    _id 
    user 
    friend 

Post 
    _id 
    user 
    timestamp 
    text 

Я пытаюсь использовать метод aggregate, чтобы получить список последних сообщений из всех моих друзей, но я хотел бы, чтобы сгруппировать вместе последовательные сообщения из того же пользователя. Так предполагая, что у меня есть 3 друзей, и они имеют следующие должности:

{"user": "user1", timestamp: 1476200010, text: "hello1"} 
{"user": "user2", timestamp: 1476200009, text: "hello2"} 
{"user": "user2", timestamp: 1476200008, text: "hello3"} 
{"user": "user3", timestamp: 1476200007, text: "hello4"} 
{"user": "user2", timestamp: 1476200006, text: "hello5"} 
{"user": "user2", timestamp: 1476200005, text: "hello6"} 
{"user": "user1", timestamp: 1476200004, text: "hello7"} 
{"user": "user1", timestamp: 1476200003, text: "hello8"} 

Я хотел бы в итоге получить следующее:

{"user": "user1", timestamp: 1476200010, text: "hello1"} 
{"user": "user2", timestamp: 1476200009, text: "hello2"} 
{"user": "user3", timestamp: 1476200007, text: "hello4"} 
{"user": "user2", timestamp: 1476200006, text: "hello5"} 
{"user": "user1", timestamp: 1476200004, text: "hello7"} 

я немного застрял с моим запросом, либо помощь оценена:

db.Post.aggregate([ 
    {$sort: {timestamp: -1}}, 
    {$lookup: {from: 'Friend', localField: '_id', foreignField: 'friend', as: 'friend'}}, 
    {$match: {'friend.user': current_user}}, 
    ??? 
    {$limit: 100}, 
]) 
+0

В связи с этим вопросом 'aggregate' не поддерживает операции с соседними документами, поэтому я думаю, что вам потребуется выполнить последовательную сортировку сообщений в коде приложения. – JohnnyHK

ответ

0

в агрегации трубопровода, все выражения, кроме аккумуляторов, используемых в состоянии группы не поддерживают состояние т.е. они не могут ссылаться на поля из предыдущих документов. Следовательно, это невозможно удовлетворить, используя только запрос Mongo. Лучше реализовать эту логику в коде приложения.

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