2015-01-25 2 views
1

Я новичок в MongoDB, но у меня, похоже, есть тривиальная проблема с Mongolab, которую я использую из Heroku.Не удается вернуть последние документы от MongoDB

Если я вставляю новый документ, я не получаю никаких ошибок. Однако MongoDB Mongolab, похоже, не возвращает никаких документов после определенного документа. Также не последний документ, который я вставляю.

Вот пример; Я вставляю новый документ и запрашиваю последний. Это должно быть то же самое, верно. Но это не так.

rs-ds027491:PRIMARY> db.measurements.insert({"temperature":"24.687","timestamp":"Sat, 24 Jan 2015 16:00:02 -0000","epoch_timestamp":1422108002}) 

WriteResult({ "nInserted" : 1 }) 

rs-ds027491:PRIMARY> db.measurements.find().limit(1).sort({$natural:-1}) 

{ "_id" : ObjectId("54c37fe687db950c001d04f4"), "temperature" : "24.75", "timestamp" : "Sat, 24 Jan 2015 13:20:02 -0000", "epoch_timestamp" : 1422098402 } 

Я также пытался перебирать все документы (как из командной строки и с помощью Robomongo я получаю тот же результат в обоих.):

db.measurements.find({}) 
... after some 'it's... 
{ "_id" : ObjectId("54c37eba87db950c001d04f3"), "temperature" : "24.75", "timestamp" : "Sat, 24 Jan 2015 13:15:02 -0000", "epoch_timestamp" : 1422098102 } 
{ "_id" : ObjectId("54c37fe687db950c001d04f4"), "temperature" : "24.75", "timestamp" : "Sat, 24 Jan 2015 13:20:02 -0000", "epoch_timestamp" : 1422098402 } 

Как вы можете видеть последний документ является один запрос выше также вернулся, а не последний документ, который я вставил.

Есть ли что-то для Монго или Монголаба, которое я не понимаю, или если эта работа - но это почему-то не так?

ответ

2

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

http://docs.mongodb.org/manual/reference/operator/meta/natural/

Если вы хотите, чтобы отсортировать документы по времени какого-либо события, относящиеся к каждому документу (например, вставить время, время последнего обновления), я рекомендовал бы отслеживать, что время явно в качестве поля, индексирование это поле, а затем сортировка по ним в ваших запросах.

+0

Это объясняет это. Ваш подход к отслеживанию времени как индекса имеет смысл. Благодаря! –

1

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

Я цитирую docs на это:

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

Вы можете ожидать более последовательного поведения, сортируя документы по _id (см. Adam's answer об этом). Тем не менее, даже this can fail:

Взаимосвязь между порядком значений ObjectId и генерация времени не является строгим в пределах одной секунды. Если несколько систем или несколько процессов или потоков в одной системе генерируют значения, в течение одной секунды; Значения ObjectId не представляют собой строгий порядок вставки . Перекос часов между клиентами также может приводить к нестандартному упорядочению даже для значений, поскольку клиентские драйверы генерируют значения ObjectId, а не процесс mongod.

Создание определенного поля для этой цели (например, даты) и индексации, вероятно, было бы самым лучшим и легким подходом.

+0

Я бы пошел с этим, если бы вы в основном показали, как сортировать по '_id', который в общем случае должен представлять« порядок вставки »или иначе очень гранулированное поле« timestamp ». Оба они имеют значение. –

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