gpt4 book ai didi

c# - 更新 MongoDB 中的嵌入式文档详细信息

转载 作者:太空狗 更新时间:2023-10-29 18:28:05 25 4
gpt4 key购买 nike

在MongoDB中,如果我有一个文档结构如下:

{ "_id" : { "$binary" : "jchPoPd7PUS1w+sR7is23w==", "$type" : "03" }, 
"companies" :
[
{ "_id" : { "$binary" : "jchPoPd7PUS1w+sR7is23w==", "$type" : "03" },
"name" : "Google" },
{ "_id" : { "$binary" : "jchPoPd7PUS1w+sR7is23w==", "$type" : "03" },
"name" : "Greenfin" },
{ "_id" : { "$binary" : "jchPoPd7PUS1w+sR7is23w==", "$type" : "03" },
"name" : "Zynet" }
],
"firstname" : "Peter",
"surname" : "Smith" }

(即 Person 文档中嵌入了 Companies 数组),然后如何更新特定公司的所有实例(通过公司 _id 定位) ) 与单个查询+更新?

我尝试了以下方法:

MongoCollection personCollection = mdb.GetCollection("person");
BsonBinaryData bin = new BsonBinaryData(new Guid("0AE91D6B-A8FA-4D0D-A94A-91D6AC9EE343"));
QueryComplete query = Query.EQ("companies._id", bin);
var update = Update.Set("companies.name", "GreenfinNewName");
SafeModeResult result = personCollection.Update(query, update, UpdateFlags.Multi);

但它不起作用。我想我的问题归结为两个问题:如何在初始查询中定位嵌入式公司,然后如何在 Set 语句中设置新公司名称。注意:在本例中,我选择了对公司数据进行“非规范化”,并将其嵌入到每个个人文档中,因此可能会有多个个人文档具有相同的公司 ID 和名称。非常感谢。

更新:使用 Bugai13 的技术,我更接近了。这有效:

MongoCollection personCollection = mdb.GetCollection("person");
QueryComplete query = Query.EQ("companies.name", "Bluefin");
var update = Update.Set("companies.$.companynotes", "companynotes update via name worked");
SafeModeResult result = personCollection.Update(query, update, UpdateFlags.Multi, SafeMode.True);

但这行不通:

MongoCollection personCollection = mdb.GetCollection("person");
BsonBinaryData bin = new BsonBinaryData(new Guid("0AE91D6B-A8FA-4D0D-A94A-91D6AC9EE343"));
Builders.QueryComplete query = Query.EQ("companies._id", bin);
var update = Update.Set("companies.$.companynotes", "companynotes update via id worked");
SafeModeResult result = personCollection.Update(query, update, UpdateFlags.Multi, SafeMode.True);

所以,我还不能使用主键更新,这是我需要做的......

最佳答案

我想你应该看看positional operator在 mongodb 中:

var update = MongoDB.Driver.Builders.Update
.Set("companies.$.name", "GreenfinNewName");
^^
all magic here

注意:以上代码只会更新数组中第一个 匹配项。因此,如果您在 name = GreenfinNewName 的嵌套数组中有两家公司,上面的代码将仅更新第一个匹配的。

注意:UpdateFlags.Multi 表示多个文档,但不是嵌套数组中的多个项目。

更新:

QueryComplete query = Query.EQ("companies._id", 
BsonValue.Create(new Guid("0AE91D6B-A8FA-4D0D-A94A-91D6AC9EE343")));
var update = Update.Set("companies.$.companynotes", "companynotes");
personCollection.Update(query, update, UpdateFlags.Multi, SafeMode.True);

希望对您有所帮助!

关于c# - 更新 MongoDB 中的嵌入式文档详细信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5521926/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com