2013-07-18 7 views
1

Как я могу реализовать на MongoDb этот SQL-запросMongoDB Group По запросу

SELECT TOP 100 * FROM Tracks 
WHERE ID IN (SELECT MAX(ID) FROM Tracks WHERE UserID IN ([UserIDs...]) GROUP BY UserID) 

Дорожки структура:

Tracks[{_id, userId, {lat, lon}, dateCreate, ...}, ...] 

Спасибо!

ответ

1

Вы хотели бы использовать структуру агрегации для этого:

db.Tracks.aggregate([ 
    { $match: { 'UserID': { $in: [ UserIDs ] } } }, 
    { $group: { _id: '$UserID', max: { $max: '$_id' } }, 
    { $sort: { $max: -1 } }, 
    { $limit: 100 } 
]); 

Сначала матч против пожелавших UserIds, то группа в зависимости от UserID, а также поставить максимальное значение _id в новом max поле. Затем мы сортируем по max по убыванию, чтобы получить наивысшие номера max, а затем ограничиваем верхние 100.

+0

ReadStartDocument можно вызывать только тогда, когда CurrentBsonType - это документ, а не когда CurrentBsonType - это массив. – Nodir

+0

Структура трека такова: http://s019.radikal.ru/i605/1307/fc/46954bba47bc.png – Nodir

+0

В вашем «треке» даже нет идентификатора пользователя, как я могу догадаться об этом? И я понятия не имею, что «ReadStartDocument можно вызывать только тогда, когда CurrentBsonType - это Document, а не когда CurrentBsonType - это Array», даже означает. Я дал вам запрос MongoDB, соответствующий вашему SQL, и это то, о чем вы просили. – Derick