【问题标题】:Get the _id of the last upserted document in java获取java中最后一个upserted文档的_id
【发布时间】:2023-03-25 14:12:02
【问题描述】:

我需要在 java 中找到最后一个 upserted 文档的 _id。我正在使用 2.0.5。如果元素已更新,我在 getLastError 返回的输出中看不到“更新”字段。如果插入了元素,我会看到它。无论元素是更新还是插入,我都需要获取 _id。除了发出另一个 find 命令之外,是否可以通过某种方式获取文档的 _id ?我正在尝试减少不必要的查询。

【问题讨论】:

  • 我认为你必须使用另一个查询。

标签: java mongodb


【解决方案1】:

您可以使用 DBCollection.findAndModify()。您可以设置它的参数,使其执行 upsert 并返回包含您刚刚创建/修改的对象的 _id 的 DBObject。

查看文档了解更多信息: http://www.mongodb.org/display/DOCS/findAndModify+Command

附录:我刚刚重新审视了我的答案,并意识到有一种更好、更简单的方法。在文档通过网络发送到服务器之前,_id 的值总是在客户端设置。如果您尚未为 _id 分配值,驱动程序会为您执行此操作。由于客户端设置了_id,您甚至在插入操作开始之前就知道它是什么。考虑这个例子。

> var id = ObjectId()
> id
ObjectId("5511062d729ddce46b99ea3f")
> db.test.insert( { _id: id, text:"a trivial experiment"})
WriteResult({ "nInserted" : 1 })
> db.test.find( { _id: id} )
{
    "_id" : ObjectId("5511062d729ddce46b99ea3f"),
    "text" : "a trivial experiment"
}

【讨论】:

  • 我相信@Asha 想要使用 upserted 功能,这样他就可以最大限度地减少所需的查询量。
  • FindAndUpdate 将执行 upsert 并在一次调用服务器中返回目标文档
  • 谢谢布莱恩,我会试试的
  • 我试过了,效果很好。它根据传递的参数返回新文档或旧文档。谢谢。
【解决方案2】:

以下代码将为您提供最后修改的记录:

db.products.find().sort({"$natural":1}).limit(1);

以下代码将为您提供最后插入的记录:

db.products.find().sort({"_id":-1}).limit(1);
db.products.find().sort({"$natural":-1}).limit(1);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-26
    • 1970-01-01
    • 2022-01-17
    相关资源
    最近更新 更多