首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在MongoDB中使用位置运算符更新多个字段的性能含义是什么?

在MongoDB中使用位置运算符更新多个字段的性能含义是什么?
EN

Stack Overflow用户
提问于 2016-10-12 06:24:29
回答 1查看 499关注 0票数 2

我以MongoDB格式存储文档,格式如下:

代码语言:javascript
运行
复制
{  
    "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  
        }  
    ]  
}

当更新文档中的特定字段时,当使用位置运算符$访问字段时,设置新值的正确方法是什么?

在本例中,我希望更新第三个元素的amountstatus,即查找条件为

{ "details.trancheID“:"45752678-04e6-490c-9836-d6c4a361e1d0”}

要更新字段,我有两种方法:

  1. 在客户端(java应用程序)构造新对象,并在整个对象上使用$set,{ "$set“:{ "details.$”:{ // full object }}

因此,位置运算符将选择第一个匹配元素(在trancheID上使用条件)并设置更新的对象。在这种方法中,我必须将整个对象(其大小可达2KB)从应用程序发送到MongoDB。

  1. 只设置必须在查询中更新的字段{ "$set“:{ "details.$.amount”:50000,"details.$.status“:3}

在这种情况下,位置运算符必须执行两次操作。我担心的是,如果使用位置运算符设置多个字段,这会导致性能损失吗?在这里,只更新了两个字段。但是它可以达到5-6个字段,而且details数组中的元素数量可能很多(在某些情况下为50个)。

现在,字段trancheID不是索引字段,但我想将其作为稀疏索引。假设它是一个索引字段,那么哪种方法比较好?

此外,如果您可以向我指出一些资源,在这些资源中我可以阅读和理解MongoDB的内部工作(比如位置操作符是如何内部工作的),这将是非常有用的。谢谢!

我正在使用MongoDB 3.0。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-10-27 03:31:28

我担心的是,如果使用位置运算符设置多个字段,这会导致性能损失吗?

没有性能损失。找到匹配的元素后,MongoDB将'$‘映射为该元素的数组下标。因此,在您的情况下,建议使用第二种方法,因为它节省了通过网络传输整个元素的成本,两次。而且,它更直接。

与往常一样,我建议您使用生产数据集测试这两种方法,以了解性能有何不同。事实上,我不认为您应该担心这两种方法之间的性能差异,除非您的测试证明这种差异是显著的。

此外,如果您可以向我指出一些资源,在这些资源中我可以阅读和理解MongoDB的内部工作(比如位置操作符是如何内部工作的),这将是非常有用的。谢谢!

MongoDB是一个开源项目。在github上,您可以找到MongoDB服务器的源代码以及许多工具。至于'$set‘和位置运算符,您可能需要查看R3.2.10源代码的UpdateDriver::更新ModifierSet::准备修正集::应用

我正在使用MongoDB 3.0。

请注意,当前的稳定版本是3.2。3.4即将到来。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39991793

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档