首页 文章

Azure Cosmos DB GetById查询无法正常工作

提问于
浏览
0

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

然后,我使用Cosmos数据库迁移工具将数据迁移到Azure Cosmos数据库模拟器,并将我的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时,结果是Object Id的单个实体 - 但是当我将连接字符串更改为模拟器时,没有返回任何内容?

这是对象在MongoDB中的外观(使用RoboMongo可视化)

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

这是使用迁移数据工具迁移后,Azure Cosmos数据库模拟器中相同对象的外观

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

它失败的原因是Id丢失了对象(“”)吗?我尝试更新Azure Cosmos数据库集合以添加它,但它给出了一个错误,表示预期值,就好像我没有指定正确的JSON格式 .

2 回答

  • 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;
    }
    
  • 0

    这不起作用的实际原因是使用Azure Cosmos DB Migration Too旨在与Cosmos DB SQL API一起使用 . 我想针对Cosmos DB API定位MongoDB API .

    将数据导入模拟器的方法是使用mongoimport和mongoexport exe,如下所示:

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

相关问题