mongodb查找后面跟着更新语义

mongodb find followed by update semantics

本文关键字:更新 新语义 查找 mongodb      更新时间:2023-10-16

这个页面显示了一个更新,它会访问以前检索到的(find)文档,并查询子元素(数组)来更新它。我几乎需要做完全相同的事情。示例代码:

> t.find()
{ "_id" : ObjectId("4b97e62bf1d8c7152c9ccb74"), "title" : "ABC",
  "comments" : [ { "by" : "joe", "votes" : 3 }, { "by" : "jane", "votes" : 7 } ] }
> t.update( {'comments.by':'joe'}, {$inc:{'comments.$.votes':1}}, false, true )

管理查找和更新的规则是什么,我在文档中没有注意到对此的解释。同样的东西也适用于通过驱动程序使用mongodb吗?链接到相关语义会很有帮助。我正在使用C++驱动程序。

编辑:自我回答

这两个命令可以合并为一个(这是消除这个问题引起的歧义的一种方法),更新的查询部分可以引用数组子元素,$符号将引用它。我假设在更新操作的查询部分只能引用一个子元素。在我的情况下,更新操作如下:

db.qrs.update ( { "_id" : ObjectId("4f1fa126adf93ab96cb6e848"), "urls.u_id" : 171 }, { "$inc" :  { "urls.$.CC": 1} })

_id正确地为正确的唯一行"素数",第二个查询元素"urls.u_id" : 171确保所讨论的行具有正确的字段。CCD_ 4然后将CCD_ 5操作路由到正确的数组条目。

建议任何mongodb开发人员或文档编写器

不要展示具有潜在种族条件的示例。始终避免显示可以原子化完成的多个操作。

规则相对简单。更新的结果可能对任何后续读取都可用,也可能不可用,这取决于许多因素(slaveOk true/false与repset结合使用、使用不同连接进行更新和查找、写入安全性)。如果进行安全写入(w>=1)并在同一连接上执行查找,则可以保证它可用。大多数驱动程序都为此提供了功能(通常为"requestStart"answers"requestDone")。

尽管如此,有一个更好的解决方案可供您使用,即findAndModify。此操作查找文档并更新它,然后返回文档的旧版本或新更新的版本。该命令在C++驱动程序中可用。如需参考,请查看此处:http://www.mongodb.org/display/DOCS/findAndModify+命令

编辑:请注意,示例中的"查找"只是为了向文档的读者展示集合中文档的结构/模式,以便在上下文中放置后续的"更新"。"更新"操作决不受之前的"查找"操作的影响。