MongoDB替换特定的数组值

use*_*596 11 arrays mongodb

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

数组值不是任何特定顺序.

我现在如何根据某些特定值更新数组值?假设我要更新所有"法语"并将其替换为"Francais"以用于整个集合.我怎样才能做到这一点?

chr*_*dam 14

使用位置$运算符来标识languages数组中的元素,而不显式指定它在数组中的位置,而不是事先知道位置并将元素更新为:

db.movies.updateMany(
    { "languages": "French" }, 
    { "$set": { "languages.2": "Francais" } }
)
Run Code Online (Sandbox Code Playgroud)

你可以使用$运算符:

db.movies.updateMany(
    { "languages": "French" }, 
    { "$set": { "languages.$": "Francais" } }
)
Run Code Online (Sandbox Code Playgroud)


dni*_*ess 6

如果您的数组中有重复的条目,如下所示:

"languages" : [ 
    "USA", 
    "German", 
    "Francais",
    "Francais"
]
Run Code Online (Sandbox Code Playgroud)

您可以使用以下语法替换从 MongoDB v3.5.12 开始的所有匹配项(文档

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

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