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

Jou*_*man 8 c# mongodb

在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" }
Run Code Online (Sandbox Code Playgroud)

(即,在人员文档中嵌入PersonCompanies数组的文档),那么如何使用单个查询+更新更新特定公司的所有事件(通过公司_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);
Run Code Online (Sandbox Code Playgroud)

但它不起作用.我想我的问题归结为两个问题:如何在初始查询中定位嵌入式公司,然后如何在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);
Run Code Online (Sandbox Code Playgroud)

但这不起作用:

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);
Run Code Online (Sandbox Code Playgroud)

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

And*_*ich 10

我想你应该看看mongodb中的位置运算符:

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

注意:上面的代码只会更新first数组中匹配的项目.因此,如果你有两个公司的嵌套数组,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);
Run Code Online (Sandbox Code Playgroud)

希望这有帮助!