Azure Cosmos DB GetById查询不起作用

时间:2018-09-18 11:30:01

标签: .net mongodb azure azure-cosmosdb mongodb-.net-driver

我有一个当前正在使用Mongo DB的应用程序。我希望将应用程序移动到Azure并尝试使用Cosmos DB。我将代码中的C#Mongo DB驱动程序升级到了最新版本2.7.0,并且即使使用Mongo DB,它也可以正常工作。

然后,我使用Cosmos DB迁移工具将数据迁移到Azure Cosmos DB仿真器,并在Web配置中更改了连接字符串以指向仿真器。应用程序正在加载,并且在我的第一个屏幕上返回了一些参考数据,但是下面的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;
    }

当我在Web配置中连接到Mongo DB时,结果是对象ID的单个实体-但是,当我将连接字符串更改为仿真器时,什么都没有返回?

这是对象在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丢失了Object(“”)吗?我试图更新Azure Cosmos DB集合以添加该集合,但是它给出了一个错误,提示期望值,好像我没有指定正确的JSON格式。

2 个答案:

答案 0 :(得分:1)

从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;
}

答案 1 :(得分:0)

无法正常工作的实际原因是使用Azure Cosmos DB Migration Too旨在与Cosmos DB SQL API一起使用。我想将MongoDB API定位为Cosmos DB API。

为此将数据导入仿真器的方法是使用mongoimport和mongoexport exe,如下所示:

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