【发布时间】:2011-07-28 04:10:30
【问题描述】:
在 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" }
(即在个人文档中嵌入Companies 数组的Person 文档),那么我如何通过单个查询+更新更新所有出现的特定公司(通过公司_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);
所以,我还不能使用主键进行更新,这是我需要做的...
【问题讨论】: