我需要更新嵌套集合中的属性。所有示例都描述了有关设置具体值的信息,而不是有关其他字段中的值的信息。
MongoDB版本:4.2
C#驱动程序版本:2.10.4
产品示例:
{
_id: "1",
Title: "Some title",
Price: 20,
OriginalPrice: 10,
... other props ...
Variants:
[
{
Price: 21,
OriginalPrice: 11
... other props ...
},
{
Price: 22,
OriginalPrice: 13
... other props ...
},
]
}
我知道如何更新 Price
var pipeline = PipelineDefinition<Product, Product>.Create("{'$set': {'Price': '$OriginalPrice'}}");
productCollection.UpdateMany(FilterDefinition<Product>.Empty, Builders<Product>.Update.Pipeline(pipeline));
但是我怎么能更新Variants.Price
为Variants.OriginalPrice
?试
var pipeline = PipelineDefinition<Product, Product>.Create("{'$set': {'Price': '$OriginalPrice', 'Variants.$[].Price': '$Variants.$[].OriginalPrice'}}");
productCollection.UpdateMany(FilterDefinition<Product>.Empty, Builders<Product>.Update.Pipeline(pipeline));
但是发生了错误。
更新1:变量包含其他属性。
@Mickl的答案是解决方案,但是
是覆盖整个嵌套集合的最佳方法吗?
更新表达式的右侧需要为MongoDB聚合表达式1,当前您正在使用常规的“更新”语法。根据文档:
指定要添加的每个字段的名称,并将其值设置为聚合表达式。有关表达式的更多信息,请参见表达式
在$地图运营商可以用来实现你想要的:
var set = @"{
$set:
{
Variants:
{
$map:
{
input: '$Variants',
in: { $mergeObjects: [ '$$this', { Price: '$$this.OriginalPrice' } ] }
}
}
}
}";
var pipeline = PipelineDefinition<Product, Product>.Create(set);
var res = productCollection.UpdateMany(FilterDefinition<Product>.Empty, Builders<Product>.Update.Pipeline(pipeline));
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句