Я печатал так же, как первый ответ Даймона, используя sort
и limit
.Это, вероятно, не рекомендуется, особенно с некоторыми драйверами (которые используют случайные числа вместо приращений для наименее значимой части) из-за способа генерации _id.Он имеет второе [в отличие от чего-то меньшего, например, миллисекунды], разрешение в качестве наиболее значимой части, но последнее число может быть случайным числом.Таким образом, если пользователь сохранял данные дважды в секунду (вероятно, маловероятно, но стоит отметить), вы можете получить немного вышедший из строя последний документ.
Подробнее см. http://www.mongodb.org/display/DOCS/Object+IDs#ObjectIDs-BSONObjectIDSpecification.по структуре ObjectID.
Я бы порекомендовал добавить явное поле versionNumber к вашим документам, чтобы вы могли делать запрос аналогичным образом, используя это поле, например:
db.coll.find({documentId: <id>}).sort({versionNum: -1}).limit(1);
изменить, чтобы ответить на вопрос в комментариях
Вы можете хранить обычный DateTime непосредственно в MongoDB, но он будет хранить точность только в миллисекундах в формате «DateTime» в MongoDB.Если это достаточно хорошо, это проще сделать.
BsonDocument doc = new BsonDocument("dt", DateTime.UtcNow);
coll.Insert (doc);
doc = coll.FindOne();
// see it doesn't have precision...
Console.WriteLine(doc.GetValue("dt").AsUniversalTime.Ticks);
Если вам нужна точность .NET DateTime (тики) / Timestamp, вы можете выполнить кучу приведений, чтобы она заработала, например:
BsonDocument doc = new BsonDocument("dt", new BsonTimestamp(DateTime.UtcNow.Ticks));
coll.Insert (doc);
doc = coll.FindOne();
// see it does have precision
Console.WriteLine(new DateTime(doc.GetValue("dt").AsBsonTimestamp.Value).Ticks);
обновите снова!
Похоже, реальное использование BsonTimestamp - генерировать уникальные временные метки с точностью до секунды.Таким образом, вы не должны злоупотреблять ими, как я делал в последних нескольких строках кода, и это, вероятно, испортит порядок результатов.Если вам нужно хранить DateTime с разрешением Tick (100 наносекунд), вам, вероятно, следует просто сохранить 64-битные int-тики, которые будут сортироваться в mongodb, а затем обернуть их в DateTime после того, как вы вытащитеопять база данных, вот так:
BsonDocument doc = new BsonDocument("dt", DateTime.UtcNow.Ticks);
coll.Insert (doc);
doc = coll.FindOne();
DateTime dt = new DateTime(doc.GetValue("dt").AsInt64);
// see it does have precision
Console.WriteLine(dt.Ticks);