2014-06-02 2 views
2

Я довольно новичок в работе с MongoDB.Учитывая конкретную запись, извлечение предыдущей в коллекции MongoDB

Мне нужно получить предыдущую запись данной записи в коллекции MongoDB.

  1. Возможно ли это с полем «_id = ObjectId (...)»?
  2. Если нет, нужно ли нам явно вставить ключ с последовательным значением для идентификации предыдущей записи на данный? (Предположим, что в текущей коллекции нет последовательной пары ключ/значение)

Поблагодарили бы за любую помощь. Спасибо.

ответ

2

Все значения равны по умолчанию для поля _id: ObjectId и является монотонным или постоянно увеличивающимся.

Это означает, что дано известное ObjectId значение, то справедливо следующее, чтобы получить документ, который был вставлен непосредственно перед ней:

db.collection.find(
    { "_id": { "$lt": ObjectId("538c271a19b3a188ca6135eb") }} 
).sort({ "_id": -1 }).limit(1) 

То есть общий случай. Единственное возможное отклонение состоит в том, что различные источники генерируют значения ObjectId, а их часы устанавливаются в разное время (как в совершенно разных UTC).

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

2

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

В качестве примера: Создание индексов:

db.books.ensureIndex({book: 1}) // for next records in collection 
db.books.ensureIndex({book: -1}) // for previous records in collection 

Следующая запрос выглядит следующим образом:

db.books.find({book: {$gt:"a"}}).sort({book: 1}).hint({book: 1}).limit(1) 

Предыдущий запрос выглядит следующим образом:

db.books.find({book: {$lt:"b"}}).sort({book: -1}).hint({book: -1}).limit(1) 
+1

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

+0

Спасибо всем за ценную обратную связь. Я сделал приведенный ниже код, используя casbah в scala, для указания индексов. Не могли бы вы рассказать мне, нахожусь ли я на правильном пути. 'val collection = MongoConnection() () (<Имя коллекции>) collection.ensureIndex (DBObject (" days "-> 1)) val record = (collection.find (" days "$ lt begin)) sort (MongoDBObject («days» -> -1)). Limit (1) ' – hel

+0

@hel Не знаете, почему вы приняли ответ, который является противоположностью вопроса, который вы действительно задали. Я только проговорил в конце, когда этот ответ был дан после того, что я уже предоставил. Если вам нужен порядок вставки, используйте поле '_id', как было объяснено. –