使用c#驱动程序在MongoDB中使用此对象的另一个属性更新嵌套集合中的对象属性

叶夫根尼·伊万诺夫(Evgeny Ivanov)

我需要更新嵌套集合中的属性所有示例都描述了有关设置具体值的信息,而不是有关其他字段中的值的信息。

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.PriceVariants.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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

在 C# 中使用属性值作为另一个对象的实例名称

选择一个嵌套属性以使用节点驱动程序在mongo中更新

C# 中的 FluentValidation - 使用另一个对象中的属性进行验证

使用C#驱动程序在嵌套mongo集合中添加新对象

从当前对象获取属性以在另一个对象中使用属性值

如何访问一个对象的方法/属性以在 Python 中的另一个对象中使用?

如何使用新对象填充集合,从另一个集合复制属性

如何在javascript中的另一个函数中使用函数作为对象的属性

使用流从嵌套在另一个对象列表中的对象列表中筛选属性

C#| 使用另一个实例的属性初始化新对象的语法

使用按钮C#将对象属性从窗体控制到另一个窗体

如何使用 C# 驱动程序将文档移动到 MongoDB 中的另一个数据库?

如何在C#中获取另一个对象的属性的对象类型?

根据另一个属性的值更新嵌套对象属性-JS

从另一个对象更新JavaScript对象属性

如何使用C#MongoDB驱动程序编写嵌套对象属性不能相等的强类型过滤器?

在React中,如何使用另一个属性值获取对象的属性值?

使用 Jq 在另一个属性中插入对象的属性

Oracle ADF-Jdeveloper在View对象的另一个属性的值中使用shortdesc

如何检查一个对象是否嵌套在另一个对象的属性中作为属性?

如何获取嵌套在另一个对象中的对象的已知属性?

JavaScript + discord.js:如何在存储在同一对象中的另一个对象中使用对象的属性?

使用FindOneAndUpdateOptions类C#驱动程序在findAndModify中使用MongoDB映射属性'new'

在Unity C#中使一个对象从另一个对象中消失

使用linq根据另一个列表的属性从列表中删除对象

如何使用for循环在另一个对象中设置属性值?

如何使用另一个列表中对象的属性制作新列表

使用变量作为车把中另一个对象的属性名称

C# 对象引用另一个对象的属性