Ошибка при изменении элемента массива MongoDb

217
01 марта 2018, 10:08

В моём Azure CosmosDb MongoApi есть JSON с вложенным массивом документов.

{
    "_id": ObjectId("5a95745df886842904b82f71"),
    "token": "value1",
    "channel": "value2",
    "urls":
    [
        {
            "url": "<url1>", 
            "interval": "<int>"
        },
        {
            "url": "<url2>"
            "interval": "<int>"
        }
    ]
}

Я хочу обновить поле "interval" у конкретного элемента массива. Проблема в том, что когда я использую такие решения, как это или это, я получаю следующий экспешн:

MongoDB.Driver.MongoCommandException: Command findAndModify failed: Invalid BSON field name 'urls.$.interval'.

Тогда я решил сделать запрос через Mongo Shell и получил такую же ошибку:

{
    "nMatched": 0,
    "nUpserted": 0,
    "nModified": 0,
    "writeError": 
    {
        "code": 2,
        "errmsg": "Invalid BSON field name 'urls.$.interval'"
    }
}

Вот мой C# код:

    var filterBuilder = Builders<User>.Filter;
    var filter = filterBuilder.Where(p => p.Token == model.Token && p.Channel == model.Channel && p.Urls.Any( u => u.Url == model.Url));
    var update = Builders<User>.Update.Set(p => p.Urls.ElementAt(-1).interval, 5);
    await _context.Users.FindOneAndUpdateAsync<User>(filter, update);

Вот мой запрос в MongoDb shell:

db.Users.update( {"urls.interval": 60}, {$set: {"urls.$.interval": 30}} ); 

Вопрос в том, откуда экспешн берётся и как его избежать?

Answer 1

Получил ответ на английском SO, проблема была в том, что CosmosDB не поддерживает операторы позиционирования, ссылка на ответ

READ ALSO
Расшифровка паролей

Расшифровка паролей

Здравствуйте, пишу импорт паролей, требуется расшифровка

215
Рефакторинг кода парсера URL

Рефакторинг кода парсера URL

Создаю парсер URL на C#Задача: вывести top-N доменов, top-N путей

228
Расстояние между элементами ListBox

Расстояние между элементами ListBox

Желаемый результат выглядит так:

331
сравнение наименований в справочниках

сравнение наименований в справочниках

доброго времени сутоксвалилась на меня интересная задача, но не знаю с какой стороны к ней подступиться

185