Обновление встроенного свойства документа с использованием новой версии драйвера MongoDB и C # (2.0) - PullRequest
0 голосов
/ 22 мая 2018

У меня проблема при попытке обновить свойство в списке встроенных документов.Свойство, для которого я пытаюсь выполнить частичное обновление, - это «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
            }
        }
    ]
}

IЯ использую серверную часть 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 #.Любые указатели или ссылки на полезные ресурсы будут оценены.

1 Ответ

0 голосов
/ 24 мая 2018

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

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

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

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...