在MongoDB中,我有一个包含多种语言的电影收藏集,例如
languages: [0:USA, 1: German, 2: French, ...etc]
数组值没有任何特定顺序。
我现在如何根据某些特定值更新数组值?让我们说我想更新所有"法语"并将其替换为" Francais"整个系列。我怎么能这样做?
答案 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" }
值作为第一个参数。