mongodb查找后面跟着更新语义
mongodb find followed by update semantics
这个页面显示了一个更新,它会访问以前检索到的(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+命令
编辑:请注意,示例中的"查找"只是为了向文档的读者展示集合中文档的结构/模式,以便在上下文中放置后续的"更新"。"更新"操作决不受之前的"查找"操作的影响。
- Qt:当QListView获得新条目时,如何更新QStringList
- 如果我想在没有更新编译器的情况下使用新功能,该怎么办?
- C++:添加新结构时,结构指针向量中的所有元素都会更新
- C++/RapidXML:编辑节点并写入新的 XML 文件没有更新的节点
- 如何告诉VTK管道使用通过TimerEvent更新的新vtkPolyData?
- 如何在将新的 subky 添加到 HKEY_LOCAL_MACHINE\软件\类 后更新HKEY_CLASSES_R
- 需要更新Qt .pro和Visual Studio .vcxproj添加新文件
- 自 Visual Studio 15.6.2 编译器更新以来的新 C++17 [[nodiscard]] 警告是否符合标
- 使用 glUniformMatrix4fv() 用新矩阵更新旧矩阵?
- 插入新元素时结束迭代器会获得更新
- C++自动更新到新版本
- 使用WinSparkle更新新版本后,它不会自动启动应用程序
- 如何检查对象属性更新是否存在 std::map 键,否则插入一个新键?
- 如何在不输出新行的情况下更新终端中的输出字段
- 如何在 Linux 中的单独/包含目录中编译额外/更新的库以及新程序
- mongodb查找后面跟着更新语义
- 使用新放置来更新参照杆件
- Visual Studio C++在生成后不会更新新代码
- 在c++中自动更新新结构体中的相关值
- 只选择MySQL数据库/表中的更新/新行