Java MongoDB FindOne获取最后插入的记录

18

我正在将大量数据导入Mongo,需要让外部客户端连接并从最后一个可用记录中获取数据流,而非更旧的任何内容。我已经有一个可追溯光标(tailable cursor),它可以正常工作,但是它从表格的开头开始,我希望它从最近插入的记录开始。我知道如何做到这一点,只要我有最后插入记录的_ID。我的问题是我无法在Java中使findOne正常工作,以返回最后插入的记录。简而言之,我需要Java版的这个Mongo JS命令:

db.market.findOne( {$query:{}, $orderby:{$natural:-1}} )

这里有几篇文章我发现它们似乎与此类似,但它们假设客户端也是插入记录的人并且已经知道最后可用ID。

总之,实现相同功能的正确对应Java代码是什么 - 即获取最后可用记录的 _ID 值?

我猜作为替代方案,我可以让客户端插入一个临时记录,获取该ID,并从那里开始,但我更愿意用正确的方式完成。

谢谢


3
我已经寻找了一整天,虽然有基本文档,但在网上找不到任何示例,而且我尝试的所有排列组合都无法工作。这就是为什么我在这里问的原因。 - mikepinch
5个回答

54

需要明确的是,自然顺序不是插入顺序,仅在有限制集合的情况下才是。您需要另一个标准进行排序。

假设您正在使用默认的ObjectID,您可以将其用作插入度量标准,因为默认值以插入时间(毫秒级)开头并始终唯一。

您还应该使用find而不是findOne。请尝试以下操作:

db.market.find({}).sort({_id:-1}).limit(1)

为什么使用.find而不是.findOne - naoxink
6
在写作时,findOne shell 助手不允许您设置排序选项等。 - daveh
关于 findOne 不起作用的问题已经不再存在。 - Vahid Amiri

2
如果你想在你的JAVA代码中实现这个,你可以像下面这样做。
Document myDoc = (Document)collection.find().sort(new BasicDBObject(<field>,-1)).first();

它将返回一个文档,该文档是按照该重要字段排序的最后插入的文档。=)


2

对于任何寻找最新答案的人:

以下是如何在Java项目中使用mongodb-driver通过"_id"查找最后插入的元素。

最初的回答:

// connect to your collection. 
MongoCollection<Document> collection = database.getCollection("yourCollection");

//request last inserted doc
Document myDoc = collection.find().sort(new Document("_id", -1)).first();

最初的回答
希望这可以帮助你!

1
最佳方式:
.findOne({ [条件] }, { sort: {_id: -1}, limit: 1 });
db.market.findOne({}, {sort: {_id: -1}, limit: 1 });

小修正,第二个参数是用于投影的,选项对象在第三个位置。所以应该是 db.market.findOne({}, {}, {sort: {_id: -1}, limit: 1 }); - undefined

1
Document lastInsertion = new MongoClient().getDatabase("collectionName").find().sort(new BasicDBObject("_id", -1)).first();
lastInsertion.get("key");

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接