Я понимаю, что существует несколько способов выполнить это обновление данных.
Но хотелось бы использовать ArrayFilter в учебных целях.
Это обновление заменяет PlayerName на "Josh" с использованием идентификатора документа проигрывателя.
Обратите внимание: в целях проверки работоспособности, если я изменю BsonDocumentArrayFilterDefinition на соответствие PlayerName вместо ID, то обновление пройдет успешно.
Пример документа (обрезанный):
Код: Выделить всё
db.Teams.find()
[
{
_id: ObjectId('000000000000000000002000'),
TeamName: 'GoldDiggers',
Players: [
{
_id: ObjectId('000000000000000000002001'),
PlayerName: 'Gary',
},
{
_id: ObjectId('000000000000000000002002'),
PlayerName: 'Greg',
},
]
}
]
Код: Выделить всё
db.Teams.updateOne(
{ _id: new ObjectId("000000000000000000002000") },
{ $set: { "Players.$[myIdentifier1].PlayerName": "Josh" } },
{
arrayFilters:
[
{"myIdentifier1._id": { $eq: new ObjectId("000000000000000000002001") }}
]
}
)
Код: Выделить всё
string myIdentifier1 = "firstIdentifier";
var filterTeam = Builders.Filter.Eq("Id", "000000000000000000002000");
var updateUsingArrayFilter = Builders.Update.Set($"Players.$[{myIdentifier1}].PlayerName", "Josh");
var arrayFilter1 = new BsonDocumentArrayFilterDefinition
(
// new BsonDocument($"{myIdentifier1}.PlayerName", new BsonDocument("$eq", "Gary")) // Sanity check - using PlayerName instead of ID => successful update
// new BsonDocument($"{myIdentifier1}.Id", "000000000000000000002001")
// new BsonDocument($"{myIdentifier1}._id", "000000000000000000002001")
// new BsonDocument($"{myIdentifier1}.Id", new BsonDocument("$eq", "000000000000000000002001"))
new BsonDocument($"{myIdentifier1}._id", new BsonDocument("$eq", "000000000000000000002001"))
);
arrayFilters = new List { arrayFilter1 };
updateOptions = new UpdateOptions
{
ArrayFilters = arrayFilters
};
var result = collection.UpdateOne(filterTeam, updateUsingArrayFilter, updateOptions);
Код: Выделить всё
Command started update UpdateSubDocumentTesting { "update" : "Teams", "ordered" : true, "$db" : "UpdateSubDocumentTesting", "lsid" : { "id" : { "$binary" : { "base64" : "tFsUYfi2SLyLv1vi3JF6eg==", "subType" : "04" } } }, "updates" : [{ "q" : { "_id" : { "$oid" : "000000000000000000002000" } },
"u" : { "$set" : { "Players.$[firstIdentifier].PlayerName" : "Josh" } },
"arrayFilters" : [{ "firstIdentifier.Id" : "000000000000000000002001" }] }] }
Command started update UpdateSubDocumentTesting { "update" : "Teams", "ordered" : true, "$db" : "UpdateSubDocumentTesting", "lsid" : { "id" : { "$binary" : { "base64" : "siFCYB15RiOsqa3zB3FFSg==", "subType" : "04" } } }, "updates" : [{ "q" : { "_id" : { "$oid" : "000000000000000000002000" } },
"u" : { "$set" : { "Players.$[firstIdentifier].PlayerName" : "Josh" } },
"arrayFilters" : [{ "firstIdentifier._id" : "000000000000000000002001" }] }] }
Command started update UpdateSubDocumentTesting { "update" : "Teams", "ordered" : true, "$db" : "UpdateSubDocumentTesting", "lsid" : { "id" : { "$binary" : { "base64" : "1MjYpIlTTJGzBLQD0oa/bQ==", "subType" : "04" } } }, "updates" : [{ "q" : { "_id" : { "$oid" : "000000000000000000002000" } },
"u" : { "$set" : { "Players.$[firstIdentifier].PlayerName" : "Josh" } },
"arrayFilters" : [{ "firstIdentifier.Id" : { "$eq" : "000000000000000000002001" } }] }] }
Command started update UpdateSubDocumentTesting { "update" : "Teams", "ordered" : true, "$db" : "UpdateSubDocumentTesting", "lsid" : { "id" : { "$binary" : { "base64" : "9/5IuiFsTP6bgcLQaF5lqw==", "subType" : "04" } } }, "updates" : [{ "q" : { "_id" : { "$oid" : "000000000000000000002000" } },
"u" : { "$set" : { "Players.$[firstIdentifier].PlayerName" : "Josh" } },
"arrayFilters" : [{ "firstIdentifier._id" : { "$eq" : "000000000000000000002001" } }] }] }
Мобильная версия