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);