Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/265.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何从字典更新MongoDB中的所有键?_C#_Mongodb_Dictionary - Fatal编程技术网

C# 如何从字典更新MongoDB中的所有键?

C# 如何从字典更新MongoDB中的所有键?,c#,mongodb,dictionary,C#,Mongodb,Dictionary,我有一个目标: public class ObjA { [BsonElement("_id")] public int ID { get; set; } [BsonElement("languages")] public Dictionary<string, ObjB> languages { get; set; } } public class ObjB { [BsonElement(&

我有一个目标:

public class ObjA
{
    [BsonElement("_id")]
    public int ID { get; set; }
    
    [BsonElement("languages")]  
    public Dictionary<string, ObjB> languages { get; set; }
}

public class ObjB
{
    [BsonElement("translation_1")]
    public string Translation_1 { get; set; }
    
    [BsonElement("translation_2")]
    public string Translation_2 { get; set; }
    
    [BsonElement("translation_3")]
    public string Translation_3 { get; set; }
}
在某些情况下,我需要更新的Translation_1属性 ObjA对象的语言属性中的每个键的ObjB

下面是聚合管道代码的更新,第一个是
mongo
shell版本,第二个是C#版本。更新修改了
ObjB
translation\u 1
属性的值,用于
ObjA
语言
字典属性的所有键

var NEW_VALUE = "some new value"
var someId = "some id value"

db.test.updateOne(
  { _id: someId },
  [
    { 
        $set: { 
            languages: {
                $map: {
                     input: { $objectToArray: "$languages" }, 
                     as: "ele",
                     in: {
                         $mergeObjects: [ 
                             "$$ele", 
                             { "v": { 
                                  "translation_1": NEW_VALUE, 
                                  "translation_2": "$$ele.v.translation_2",
                                  "translation_3": "$$ele.v.translation_3" 
                        } }  ]
                     }
                }
            } 
    }},
    { 
        $set: { 
            languages: {
                $arrayToObject: "$languages" 
            }
    }},
  ]
)

var pipeline=new bsondocumentstagepelinedefinition(
新[]{
新的BsonDocument($set),
新的BsonDocument(“语言”,
新的BsonDocument($map),
新的B文件{
{“输入”,新的BsonDocument($objectToArray,“$languages”)},
{“as”,“ele”},
{“在”,
新的BsonDocument($mergeObjects),
新贝索奈酒店{
“$$ele”,
新的B文件(“v”,
新的B文件{
{“translation_1”,新值},
{“translation_2”,“$$ele.v.translation_2”},
{“translation_3”,“$$ele.v.translation_3”}
})
}) }
}
))),
新的BsonDocument($set),
新的BsonDocument(“语言”,
新的BsonDocument(“$arrayToObject”,“$languages”)
))
} 
);
System.Linq.Expressions.Expression filter=x=>x.id==someId;
var update=新管道更新定义(管道);
var result=collection.UpdateOne(过滤器,更新);

你能告诉我们你的尝试吗?@Prasadelkikikar我已经做了一个更新,但是我不知道这个更新需要使用什么。并且,您可以使用聚合运算符
$objectToArray
将所有键值对作为一个数组,您可以更新其中的
Translation\u 1
特定属性(用于语言的所有属性)。
var NEW_VALUE = "some new value"
var someId = "some id value"

db.test.updateOne(
  { _id: someId },
  [
    { 
        $set: { 
            languages: {
                $map: {
                     input: { $objectToArray: "$languages" }, 
                     as: "ele",
                     in: {
                         $mergeObjects: [ 
                             "$$ele", 
                             { "v": { 
                                  "translation_1": NEW_VALUE, 
                                  "translation_2": "$$ele.v.translation_2",
                                  "translation_3": "$$ele.v.translation_3" 
                        } }  ]
                     }
                }
            } 
    }},
    { 
        $set: { 
            languages: {
                $arrayToObject: "$languages" 
            }
    }},
  ]
)
var pipeline = new BsonDocumentStagePipelineDefinition<ObjA, ObjA>(
                         new[] { 
                             new BsonDocument("$set", 
                                 new BsonDocument("languages", 
                                     new BsonDocument("$map", 
                                          new BsonDocument {
                                              { "input", new BsonDocument("$objectToArray", "$languages") }, 
                                              { "as", "ele" }, 
                                              { "in", 
                                                     new BsonDocument("$mergeObjects", 
                                                         new BsonArray {
                                                             "$$ele",
                                                                  new BsonDocument("v", 
                                                                      new BsonDocument {
                                                                          { "translation_1", NEW_VALUE },
                                                                          { "translation_2", "$$ele.v.translation_2" },
                                                                          { "translation_3", "$$ele.v.translation_3" }
                                                                  })
                                              }) }
                                          }
                             ))),
                             new BsonDocument("$set", 
                                 new BsonDocument("languages", 
                                     new BsonDocument("$arrayToObject", "$languages")
                             ))
                         } 
);

System.Linq.Expressions.Expression<Func<ObjA, bool>> filter = x => x.id == someId;
var update = new PipelineUpdateDefinition<ObjA>(pipeline);
var result =  collection.UpdateOne<ObjA>(filter, update);