В 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. Примечание. В этом примере я выбрал «денормализацию» данных компании и встраивание их в документ каждого человека, поэтому может быть несколько документов человека с одним и тем же идентификатором и названием компании. Большое спасибо.
UPDATE:
Используя технику 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);
Итак, я пока не могу обновить с помощью первичного ключа, что мне и нужно сделать ...