2012-08-17 5 views
0

У меня есть коллекция следующей схемы:получать последний отдельный элемент MongoDB, MySQL

{ 
    "_id" : ObjectId("502e66f201f04e16a8885e8c"), 
    "sensorID" : 2, // id of the sensor 
    "loc" : [3, 2], // location of the sensor x,y 
    "time" : new Date("Fri, 17 Aug 2012 19:44:50 GMT +04:00") // time of the last meausurement 
} 

Итак, есть несколько датчиков в сети. Они двигаются, и каждые х секунд они сообщают серверу о своем местонахождении.

Я хотел бы найти последнее опознаваемое местоположение каждого датчика.

, что я пытаюсь сделать:

db.runCommand({distinct: 'points', key: 'sensorID'}) 

выбрать все различные датчики, но я не могу понять, где я должен поставить дополнительные Сдерживает в последний раз.

И самый важный вопрос. Должен ли я на самом деле делать это в манго. Может быть, лучше использовать MySql

+2

Я пытался сделать что-то подобное и не мог понять, как это сделать. Я закончил тем, что изменил свою структуру данных, чтобы он сохранил флаг, указывающий, что это последнее обновление для этого объекта. http://stackoverflow.com/questions/11908287/find-the-first-item-for-each-distinct-object-in-a-sorted-query – InPursuit

ответ

0

Являются ли датчики отчетными примерно в то же время и являются частично устаревшими данными?

В основном существует множество способов решения этой проблемы.

Один из них делает что-то похожее на db.collection.find ({}). Sort ({time: -1}). Limit (# Число датчиков #), что фактически является функцией MAX во времени, что даст вам самые последние положения датчиков. Однако этот подход будет работать только в том случае, если все датчики будут передаваться одновременно и, конечно же, подвержены частично устаревшим данным или дублирующим данным для одного датчика, если один из других датчиков особенно медленный в отчетности, так что состояние гонки, когда один датчик дважды обновлялся с момента последнего обновления медленных датчиков, заставляя его отображаться дважды в списке, исключая медленный датчик. , Можно было бы исправить это, добавив отдельное предложение, которое вы указали выше, однако это может привести к потенциально устаревшим данным, но самое большее одно. Если один цикл за каждым раз в то время не имеет большого значения, тогда это правдоподобно.

Другой подход запрашивает для каждого датчика по одному за раз с чем-то вроде

db.collection.find ({ "SensorId: #sensorID #"}). Сортировки ({время: -1}). Предел (1);

Еще один подход, который изменил вашу схему, чтобы иметь «самый последний» флаг. И при вставке новой точки и времени датчика просто запросите старый «самый последний» документ для этого датчика и обновите его до false. Это включает в себя немного обработки ошибок, так как вы никогда не хотите ситуации, когда нет «самых последних», и вы запрашиваете. Поэтому лучше всего сначала установить новый флаг, в который вы вставляете флаг, в значение true. а затем обновить флаг старых документов до значения false. И затем, если вы ищете их по одному между обновлениями, вы можете сортировать их и добавить ограничение 1 для получения последних. Иначе, если вы хотите искать все сразу и получить список всех датчиков, и это происходит между обновлениями, вы можете запустить на них определенную функцию и приблизиться к приблизительному приближению для этого датчика в этом, надеюсь, редком дело.

В качестве альтернативы вы можете сделать это чисто, добавив функцию mapreduce и группируя датчики и время фильтрации.

Надеюсь, это поможет.

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