MongoDb .NET для замены строки в массиве с помощью ElemMatch()C#

Место общения программистов C#
Anonymous
MongoDb .NET для замены строки в массиве с помощью ElemMatch()

Сообщение Anonymous »

Я использую драйвер MongoDb .NET (v3.7) для замены строки в массиве с помощью ElemMatch для соответствия элементу строки массива.
Все примеры, которые я вижу относительно ElemMatch(), включают сопоставление объекта в массиве (или списке) объектов.
Могу ли я не использовать те же методы для определения строки в массиве?
Например, я хочу заменить round с треугольником и попробовал следующий код, полагая, что позиционный оператор найдет/ссылается на строку в массиве, которую необходимо изменить. Но, возможно, это невозможно с массивами примитивов?
var idFilter = Builders.Filter.Eq(d => d.Id, "000000000000000000001002");
var elemMatchFilter = Builders.Filter.ElemMatch(x => x.MyStringArray, "round");
var filtersAnded = Builders.Filter.And(idFilter, elemMatchFilter);
var update = Builders.Update.Set("MyStringArray.[$]", "triangle");
UpdateResult result = collection.UpdateOne(filtersAnded, update);

Это приводит к исключению:

Читатель JSON ожидал значение, но нашел «круглое».

Модель данных:
internal class Sample
{
[BsonRepresentation(BsonType.ObjectId)]
public string Id { get; set; } = ObjectId.GenerateNewId().ToString();

public int[] MyIntArray { get; set; } = [];
public string[] MyStringArray { get; set; } = [];
}

Код для создания 2 документов:
public const string Samples = "Samples";
IMongoDatabase? iMongoDatabase = mongoClient.GetDatabase("UpdateArraysTesting");
iMongoDatabase.CreateCollection(Samples);
SamplesCollection = iMongoDatabase!.GetCollection(Samples);

Sample sample = new() {
Id = "000000000000000000001001",
MyIntArray = new int[] { 10, 15 },
MyStringArray = new string[] {"square","box" }
};
SamplesCollection.InsertOne(sample);

sample = new()
{
Id = "000000000000000000001002",
MyIntArray = new int[] { 22, 27 },
MyStringArray = new string[] { "round", "ball" }
};
SamplesCollection.InsertOne(sample);

Вернуться в «C#»