Собираюсь ответить на ваши вопросы .:
1. Для достижения наилучшей производительности необходимо создать правильный составной индекс:
db.ChatMessage.ensureIndex({GroupId: 1, RoomId:1, Date: -1})
Тогда запрос будет выглядеть так:
db.ChatMessage.find({GroupId: 2, RoomId:3}).sort({"Date": -1})
Если вам нужно вернуть только {RoomId, MessageId}
объект, вы можете указать следующие поля:
db.ChatMessage.find({GroupId: 2, RoomId:3}, //filter messages
{RoomId:1, _id:1}) // specify set of fields thats query should return
.sort({"Date": -1}) // sort by date desc
.limit(10) // take a specific number of last messagies
Чтобы убедиться, что запрос использует правильный индекс, вы можете использовать метод объяснение () .
2. В качестве второго вопроса я предлагаю предварительно пересчитать количество новых сообщений, используя оператор set , вместо того, чтобы использовать map / reduce, поскольку он работает медленно для больших наборов данных. Или другой хороший вариант может быть добавочный асинхронное отображение / уменьшить.
В зависимости от ваших потребностей в коллекции комнат вы можете иметь NumberOfNewMessagies
или вложенный массив [{UserId, MessagiesCount}]
. Поэтому, когда вы загрузите комнату, у вас всегда будет много новых сообщений.
Кстати, дайте мне знать, если у вас возникнут проблемы с преобразованием запросов оболочки mongodb в код на C #.
Надеюсь, это поможет вам.