我将MongoDB中的文档存储为以下格式:
{
"id" : "123",
"tenure" : "360",
"details" : [
{
"trancheID" : "8087ed47-6e94-4733-ab0d-379ad420fbe2",
"amount" : "26000",
"status" : 2
},
{
"trancheID" : "096856fc-dac4-4dc9-af36-3764ffb9ab3b",
"amount" : "26000",
"status" : 2
},
{
"trancheID" : "45752678-04e6-490c-9836-d6c4a361e1d0",
"amount" : "26000",
"status" : 1
}
]
}
更新文档中的特定字段时,使用位置运算符访问字段时设置新值的正确方法是$
什么?
在此示例中,我要更新amount
和status
的第三个元素,即查找条件为
{“ details.trancheID”:“ 45752678-04e6-490c-9836-d6c4a361e1d0”}
要更新字段,我有两种方法:
$set
上构造新对象并在整个对象上使用,
{“ $ set”:{“ details。$”:{//此处为完整对象}}
因此,位置运算符将选择第一个匹配元素(使用上的条件trancheID
)并设置更新的对象。在这种方法中,我必须将整个对象(其大小可以达到2KB)从应用程序发送到MongoDB。
{“ $ set”:{“ details。$。amount”:50000“,” details。$。status“:3}}
在这种情况下,位置操作员必须采取两次行动。我担心的是,如果使用位置运算符设置了多个字段,这会导致性能损失吗?在这里,只有两个字段正在更新。但是它最多可以包含5-6个字段,并且details
数组中的元素数量可能很多(在某些情况下为50个)。
目前,该字段trancheID
还不是索引字段,但是我正在考虑将其作为稀疏索引。假设这是一个索引字段,哪种方法会好?
另外,如果您可以向我介绍一些资源,可以阅读和理解MongoDB的内部工作原理(例如位置运算符在内部的工作方式),那将非常有帮助。谢谢!
我正在使用MongoDB 3.0。
我担心的是,如果使用位置运算符设置了多个字段,这会导致性能损失吗?
没有性能损失。找到匹配的元素后,MongoDB会将“ $”映射到该元素的数组下标。因此,在您的情况下,建议使用第二种方法,因为它可以节省两次通过网络传输整个元素的成本。而且,它更直接。
与往常一样,建议您使用生产数据集对这两种方法进行测试,以了解性能如何不同。实际上,除非您的测试证明差异显着,否则我不认为您应该担心这两种方式之间的性能差异。
另外,如果您可以向我介绍一些资源,可以阅读和理解MongoDB的内部工作原理(例如位置运算符在内部的工作方式),那将非常有帮助。谢谢!
MongoDB是一个开源项目。在github上,您将找到MongoDB服务器的源代码以及许多工具。至于'$ set'和位置运算符,您可能需要研究R3.2.10源代码的UpdateDriver :: update,ModifierSet :: prepare和ModifierSet :: apply。
我正在使用MongoDB 3.0。
请注意,当前的稳定版本是3.2。而且,3.4即将推出。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句