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

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

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

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

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

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

谢谢

【问题讨论】:

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

标签: java mongodb


【解决方案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 });
        

        【讨论】:

          猜你喜欢
          • 2015-10-12
          • 2018-11-06
          • 2012-09-02
          • 1970-01-01
          • 1970-01-01
          • 2021-04-18
          • 1970-01-01
          • 1970-01-01
          • 2016-11-26
          相关资源
          最近更新 更多