【问题标题】:MongoDB Replace specific array valuesMongoDB 替换特定的数组值
【发布时间】:2018-01-31 15:14:20
【问题描述】:

在 MongoDB 中,我有一个包含多种语言的电影集合,例如
languages: [0:USA, 1: German, 2: French, ...etc]

数组值没有任何特定的顺序。

我现在如何根据某个特定值更新数组值?假设我想更新所有“法语”并将其替换为整个集合的“法语”。我该怎么做?

【问题讨论】:

  • 你试过db.movies.updateMany({ "languages": "French" }, { "$set": { "languages.$": "Francais" } })吗?参考documentation
  • 谢谢,这确实有效。我不知道那个 .$ 语法..

标签: arrays mongodb


【解决方案1】:

使用标识languages 数组中的元素的positional $ operator 进行更新,而无需明确指定其在数组中的位置,即无需提前知道位置并将元素更新为:

db.movies.updateMany(
    { "languages": "French" }, 
    { "$set": { "languages.2": "Francais" } }
)

您可以将$ 运算符用作:

db.movies.updateMany(
    { "languages": "French" }, 
    { "$set": { "languages.$": "Francais" } }
)

或者使用aggregation pipeline 进行更新操作:

db.movies.updateMany(
    { "languages": "French" }, 
    [
        { "$set": { 
            "languages": {
                "$map": {
                    "input": "$languages",
                    "in": {
                        "$cond": [
                            { "$eq": ["$$this", "French"] }, 
                            "Francais", 
                            "$$this"
                        ]
                    }
                }
            }
        } }
    ]
)

【讨论】:

    【解决方案2】:

    如果您的数组中有这样的重复条目:

    "languages" : [ 
        "USA", 
        "German", 
        "Francais",
        "Francais"
    ]
    

    您可以使用以下语法替换所有匹配项,从 MongoDB v3.5.12 (documentation) 开始

    db.movies.updateMany(
        { "languages": "French" },
        { "$set": { "languages.$[filter]": "Francais" } },
        { "arrayFilters": [ { "filter": "French" } ] }
    )
    

    严格来说,{ "languages": "French" } 过滤器是不需要的。但是,它会通过利用“语言”索引来加快速度,以防万一。如果不需要/不需要,传递一个简单的 {} 值作为第一个参数也可以。

    【讨论】:

      猜你喜欢
      • 2021-07-12
      • 2021-09-20
      • 2023-03-20
      • 1970-01-01
      • 1970-01-01
      • 2022-01-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多