У меня возникла проблема при попытке обновить свойство в списке встроенных документов. Свойство, которое я пытаюсь частично обновить, - это «SelectedDecision» в классе «CaseTaskDecision».

public class Case
{
    [BsonId]
    public ObjectId InternalId { get; set; }
    [BsonElement(elementName: "casetasks")]
    public List<CaseTask> CaseTasks { get; set; }
}

public class CaseTask
{
    [BsonId]
    public ObjectId InternalId { get; set; }

    [BsonElement(elementName: "caseTaskDecision")]
    public CaseTaskDecision CaseTaskDecision { get; set; }
}

public class CaseTaskDecision
{
    [BsonId]
    public ObjectId InternalId { get; set; }

    [BsonElement(elementName: "selectedDecision")]
    public string SelectedDecision { get; set; }
}

Ниже приведен пример документа mongodb

{
    "_id" : ObjectId("5aff22845d02052ea80f7717"),
    "casetasks" : [
        {
            "_id" : ObjectId("000000000000000000000000"),
            "caseTaskDecision" : {
                "_id" : ObjectId("000000000000000000000000"),
                "selectedDecision" : null
            }
        }
    ]
}

Я использую серверную часть Azure DocumentDB с интерфейсом MongoDB. Код C #, используемый для попытки обновления свойства:

public async Task<UpdateResult> UpdateTaskDecision(string id, string taskId, string selectedDecision)
{
     var update = Builders<CaseAPI.Models.Case>.Update.Set("casetasks.$.castTaskDecision.selectedDecision", selectedDecision);
     return await _db.GetCollection<CaseAPI.Models.Case>(_collection).UpdateOneAsync<CaseAPI.Models.Case>(o => o.Id.Equals(id) && o.CaseTasks.Any(t => t.Id.Equals(taskId)), update);
}

Обеспокоенность вызывает оператор "Set" в приведенном выше коде. Я не уверен, как указать правильное свойство для частичного обновления встроенного документа.

Я новичок в использовании MongoDB и впервые использую драйвер C #. Приветствуются любые указатели или ссылки на полезные ресурсы.

2
Taran Beekhuis 22 Май 2018 в 16:44

1 ответ

Лучший ответ

К сожалению, на момент написания этой статьи Azure Cosmos DB не поддерживает обновление отдельного элемента во встроенном массиве в MongoDB. Первоначально мы использовали Cosmos, а недавно перешли на MongoDB Atlas из-за отсутствия поддержки функций для MongoDB.

Чтобы добиться того, чего вы хотите с помощью Cosmos, вам нужно будет получить весь массив, обновить нужный элемент (в коде) и заменить все свойство массива вашего документа - что довольно неэффективно.

Стоит проверить, что Cosmos поддерживает, а что не поддерживает, поскольку есть некоторые операции, которые ему не нравятся, в основном связанные с обновлением элементов во встроенном массиве, например PullFilter.

Поддержка API MongoDB для функций и синтаксиса MongoDB

Например, взято из статьи выше:

Операторы обновления массива

$ pull (Примечание: $ pull с условием не поддерживается)

1
pieperu 24 Май 2018 в 14:33