MongoDB替换特定的数组值

时间:2018-01-31 15:14:20

标签: arrays mongodb

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

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

我现在如何根据某些特定值更新数组值?让我们说我想更新所有"法语"并将其替换为" Francais"整个系列。我怎么能这样做?

2 个答案:

答案 0 :(得分:11)

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

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

您可以将$运算符用作:

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

答案 1 :(得分:1)

如果您在数组中有重复的条目,例如:

protected static class SpecialComparator implements Comparator<SpecialDTO>
{

    @Override
    public int compare( SpecialDTO sp1, SpecialDTO sp2 )
    {
        if( !sp1.isTypeA() || !sp2.isTypeA() )
            return sp1.isTypeA().compareTo( sp2.isTypeA() );

        SpecialNestedADTO spn1 = sp1.getNestedA();
        SpecialNestedADTO spn2 = sp2.getNestedA();

        return Comparator
            .comparing( SpecialNestedADTO::getId )
            .thenComparing( SpecialNestedADTO::getReps )
            .compare( spn1, spn2 );
    }
}

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

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

严格来说,不需要db.movies.updateMany( { "languages": "French" }, { "$set": { "languages.$[filter]": "Francais" } }, { "arrayFilters": [ { "filter": "French" } ] } ) 过滤器。但是,如果有索引的话,它将通过利用“语言”索引来加快处理速度。如果不需要/不需要,也可以传递一个简单的{ "languages": "French" }值作为第一个参数。