我输入的内容与 Daimon 的第一个答案相同,使用的是 sort 和 limit。由于 _id 的生成方式,可能不建议这样做,尤其是对于某些驱动程序(它们使用随机数而不是最不重要部分的增量)。它具有第二个 [与更小的东西,如毫秒相反] 分辨率作为最重要的部分,但最后一个数字可以是随机数。因此,如果您让用户在一秒钟内保存两次(可能不太可能,但值得注意),您最终可能会得到一个稍微乱序的最新文档。
有关 ObjectID 结构的更多详细信息,请参阅http://www.mongodb.org/display/DOCS/Object+IDs#ObjectIDs-BSONObjectIDSpecification。
我建议在您的文档中添加一个明确的 versionNumber 字段,以便您可以使用该字段以类似的方式进行查询,如下所示:
db.coll.find({documentId: <id>}).sort({versionNum: -1}).limit(1);
编辑以回答 cmets 中的问题
您可以将常规日期时间直接存储在 MongoDB 中,但它只会以“日期时间”格式将毫秒精度存储在 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 (ticks)/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 的真正用途是在第二个分辨率内生成唯一的时间戳。所以,你真的不应该像我在最后几行代码中那样滥用它们,它实际上可能会搞砸结果的顺序。如果您需要以 Tick(100 纳秒)分辨率存储 DateTime,您可能应该只存储 64 位 int “ticks”,这将在 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);