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

Posted

技术标签:

【中文标题】Java MongoDB FindOne 获取最后插入的记录【英文标题】:Java MongoDB FindOne to get last inserted record 【发布时间】:2014-05-22 19:20:48 【问题描述】:

我正在向 Mongo 运行一个大型数据馈送,我需要让外部客户端连接到该馈送并从最后一个可用记录中获取馈送——而不是任何比当前更早的记录。我有一个工作得很好的可尾游标,但它从表的开头开始,我想让它从最近插入的记录开始。我知道该怎么做,假设我有最后插入记录的 _ID。我的问题是我无法让 findOne 在 Java 中正常工作以恢复最后插入的记录。简单地说,我需要这个 Mongo JS 命令的 Java 等价物:

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

我发现这里有几篇帖子看起来很相似,但他们假设客户也是插入记录的人,并且已经知道最后一个可用的 ID。

无论如何,正确的对应 Java 代码应该是什么来完成同样的事情 - 即获取最后一条可用记录的 _ID?

我想作为替代方案,我可以让我的客户插入一次性记录,获取该 ID,然后从那里开始,但我更愿意以正确的方式执行此操作。

谢谢

【问题讨论】:

我一直在寻找一整天,虽然有基本的文档,但我在网络上的任何地方都找到了零个例子,而且我无法得到任何我试图工作的排列。这就是我在这里问的原因。 【参考方案1】:

需要明确的是,自然顺序不是插入顺序,除非是有上限的集合。您将需要另一个标准来排序。

假设您使用默认的 ObjectID,您可以将其用作插入的指标,因为默认值从插入时间开始(到毫秒)并且始终是唯一的。

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

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

【讨论】:

为什么是.find 而不是.findOne findOne shell 助手不允许(或在撰写本文时不允许)设置排序选项等。 findOne 不工作的问题不再存在。【参考方案2】:

如果您想在您的 JAVA 代码中执行此操作 你可以这样做

Document myDoc = (Document)collection.find().sort(new BasicDBObject(<field>,-1)).first();

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

【讨论】:

【参考方案3】:

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

以下是在 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();

希望这会有所帮助!

【讨论】:

【参考方案4】:
Document lastInsertion = new MongoClient().getDatabase("collectionName").find().sort(new BasicDBObject("_id", -1)).first();
lastInsertion.get("key");

【讨论】:

【参考方案5】:

最好的办法:

.findOne([WHERE], sort: _id: -1, limit: 1 );

db.market.findOne(, sort: _id: -1, limit: 1 );

【讨论】:

以上是关于Java MongoDB FindOne 获取最后插入的记录的主要内容,如果未能解决你的问题,请参考以下文章

user.findOne() 总是返回 null

如何使用Java从mongodb获取最后插入的N条记录?

如何使用Java从mongodb获取最后插入的N条记录?

MongoDB User.findOne(email:email)

如何使用 MongoDB 聚合 `$lookup` 作为 `findOne()`

MongoDb findOne 结果属性未定义