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

Shubham

我将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  
        }  
    ]  
}

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

在此示例中,我要更新amountstatus的第三个元素,即查找条件为

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

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

  1. 在客户端(Java应用程序)$set构造新对象并在整个对象上使用,

    {“ $ set”:{“ details。$”:{//此处为完整对象}}

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

  1. 仅设置查询中必须更新的字段,

    {“ $ set”:{“ details。$。amount”:50000“,” details。$。status“:3}}

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

目前,该字段trancheID还不是索引字段,但是我正在考虑将其作为稀疏索引。假设这是一个索引字段,哪种方法会好?

另外,如果您可以向我介绍一些资源,可以阅读和理解MongoDB的内部工作原理(例如位置运算符在内部的工作方式),那将非常有帮助。谢谢!

我正在使用MongoDB 3.0。

Lungang Fang

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

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

与往常一样,建议您使用生产数据集对这两种方法进行测试,以了解性能如何不同。实际上,除非您的测试证明差异显着,否则我不认为您应该担心这两种方式之间的性能差异。

另外,如果您可以向我介绍一些资源,可以阅读和理解MongoDB的内部工作原理(例如位置运算符在内部的工作方式),那将非常有帮助。谢谢!

MongoDB是一个开源项目。github上,您将找到MongoDB服务器的源代码以及许多工具。至于'$ set'和位置运算符,您可能需要研究R3.2.10源代码的UpdateDriver :: updateModifierSet :: prepareModifierSet :: apply

我正在使用MongoDB 3.0。

请注意,当前的稳定版本是3.2。而且,3.4即将推出。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

MongoDB $或多个字段的运算符

使用IRB时,=>运算符左侧的含义是什么?

:* =和:= *运算符的含义是什么?

Elasticsearch使用AND运算符无法匹配多个字段

使用位置运算符$进行mongodb更新会删除其他字段:

在 mongoDB 中使用 $nin 运算符的正确方法是什么

在mongodb中使用$ gt运算符更新数组内的多个对象

Ruby中使用的独立splat运算符(*)是什么?

Groovy中使用的“?:”运算符是什么?

此代码中使用的运算符==和*是什么?

什么是补丁运算符,补丁的含义是什么

Mongodb在单个聚合中使用多个组运算符

运算符@在python中的含义是什么

Laravel:{}运算符的含义和目的是什么?

JavaScript中“ >>>”运算符的含义是什么

Haskell中“ @”运算符的含义是什么

具有多个字段更新运算符的Mongoose findOneAndUpdate

在 mongodb 中使用 $or 运算符的条件

何时在mongodb中使用“ $ and”运算符?

在mongodb中使用Like运算符

使用数组更新运算符 $[<identifier>] 与以下查询等效的 MongoDB C# 驱动程序是什么?

在QueryDSL中使用带有“ in”运算符的两个字段

在两个字段中使用Like运算符

MongoDB中的位置$运算符似乎不会更新多个文档

=> 运算符在公共字段上的用途是什么?

Mongodb多个运算符

在深度嵌套的文档查询中使用MongoDB的位置运算符$

MongoDB中的$ unwind运算符是什么?

在C中使用or运算符的最有效方法是什么?