我以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.$”:{ // full object }}因此,位置运算符将选择第一个匹配元素(在trancheID
上使用条件)并设置更新的对象。在这种方法中,我必须将整个对象(其大小可达2KB)从应用程序发送到MongoDB。
在这种情况下,位置运算符必须执行两次操作。我担心的是,如果使用位置运算符设置多个字段,这会导致性能损失吗?在这里,只更新了两个字段。但是它可以达到5-6个字段,而且details
数组中的元素数量可能很多(在某些情况下为50个)。
现在,字段trancheID
不是索引字段,但我想将其作为稀疏索引。假设它是一个索引字段,那么哪种方法比较好?
此外,如果您可以向我指出一些资源,在这些资源中我可以阅读和理解MongoDB的内部工作(比如位置操作符是如何内部工作的),这将是非常有用的。谢谢!
我正在使用MongoDB 3.0。
发布于 2016-10-27 03:31:28
我担心的是,如果使用位置运算符设置多个字段,这会导致性能损失吗?
没有性能损失。找到匹配的元素后,MongoDB将'$‘映射为该元素的数组下标。因此,在您的情况下,建议使用第二种方法,因为它节省了通过网络传输整个元素的成本,两次。而且,它更直接。
与往常一样,我建议您使用生产数据集测试这两种方法,以了解性能有何不同。事实上,我不认为您应该担心这两种方法之间的性能差异,除非您的测试证明这种差异是显著的。
此外,如果您可以向我指出一些资源,在这些资源中我可以阅读和理解MongoDB的内部工作(比如位置操作符是如何内部工作的),这将是非常有用的。谢谢!
MongoDB是一个开源项目。在github上,您可以找到MongoDB服务器的源代码以及许多工具。至于'$set‘和位置运算符,您可能需要查看R3.2.10源代码的UpdateDriver::更新、ModifierSet::准备和修正集::应用。
我正在使用MongoDB 3.0。
请注意,当前的稳定版本是3.2。3.4即将到来。
https://stackoverflow.com/questions/39991793
复制相似问题