Запрос Azure Cosmos DB GetById не работает - PullRequest
0 голосов
/ 18 сентября 2018

У меня есть приложение, которое в настоящее время использует БД Mongo.Я пытаюсь переместить приложение в Azure и пытаюсь использовать Cosmos DB.Я обновил драйвер C # Mongo DB в коде до последней версии 2.7.0, и он работает нормально, все еще используя Mongo DB.

Затем я использовал инструмент миграции Cosmos DB для переноса данных в базу данных Azure Cosmos DB.Эмулятор и изменил строку подключения в моей веб-конфигурации, чтобы указать на эмулятор.Приложение загружается, и некоторые справочные данные возвращаются на моем первом экране, но мой приведенный ниже запрос GetById не работает?

    public virtual T GetById(TKey id)
    {
        if (typeof(T).IsSubclassOf(typeof(EntityBase)))
        {
            return GetById(new ObjectId(id as string));
        }

        //code removed for brevity
    }

    public virtual T GetById(ObjectId id)
    {
        var filter = Builders<T>.Filter.Eq("_id", id);

        var result = collection.FindSync<T>(filter).FirstOrDefault();

        return result;
    }

В результате, когда я подключаюсь к моей базе данных Mongo в веб-конфигурации, получается однаИдентификатор объекта - однако, когда я изменяю строку подключения на эмулятор, ничего не возвращается?

Так выглядит объект в MongoDB (визуализируется с помощью RoboMongo)

{
    "_id" : ObjectId("5b97a56b6381fecd00f0e10a"),
    "LastUpdatedOn" : [ 
        NumberLong(636722473812102569), 
        -240
    ],
    "CreatedOn" : [ 
        NumberLong(636722473396922518), 
        -240
    ],
    "LastUpdatedBy" : "SYSTEM",
    "CreatedBy" : "TestUser",
    "VersionNumber" : 3,
    "Name" : "Audi",

Вот тактот же объект выглядит в эмуляторе Azure Cosmos DB после миграции с помощью инструмента данных миграции

{
    "_id": "5b97a56b6381fecd00f0e10a",
    "LastUpdatedOn": [
        636722473812102500,
        -240
    ],
    "CreatedOn": [
        636722473396922500,
        -240
    ],
    "LastUpdatedBy": "SYSTEM",
    "CreatedBy": "TestUser",
    "VersionNumber": 3,
    "Name": "Audi",

Может ли причина, по которой он не работает, в том, что Id потерял объект ("")?Я попытался обновить коллекцию Azure Cosmos DB, чтобы добавить ее, но выдает ошибку с указанием ожидаемого значения, как если бы я не указывал правильный формат JSON.

Ответы [ 2 ]

0 голосов
/ 18 сентября 2018

Фактическая причина, по которой это не работало, - использование Azure Cosmos DB Migration Too, предназначенное для использования с API-интерфейсом Cosmos DB SQL.Я хотел нацелить API MongoDB для API-интерфейса Cosmos DB.

Чтобы получить данные в эмуляторе, нужно использовать exe-файлы mongoimport и mongoexport, как описано здесь:

https://docs.microsoft.com/en-us/azure/cosmos-db/mongodb-migrate

0 голосов
/ 18 сентября 2018

Судя по представлению документа в эмуляторе CosmosDB, похоже, что вам нужно изменить метод GetById, чтобы использовать string вместо ObjectId.

Как-то так должно работать:

public virtual T GetById(TKey id)
{
    if (typeof(T).IsSubclassOf(typeof(EntityBase)))
    {
        return GetById(id as string);
    }

    //code removed for brevity
}

public virtual T GetById(string id)
{
    var filter = Builders<T>.Filter.Eq("_id", id);

    var result = collection.FindSync<T>(filter).FirstOrDefault();

    return result;
}
...