在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)
(即,在人员文档中嵌入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);
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)
希望这有帮助!
| 归档时间: |
|
| 查看次数: |
8879 次 |
| 最近记录: |