标签: azure-cosmosdb

Azure Cosmos MongoDB - 使用分片键创建集合

我需要在 Azure 的 Cosmos MongoDB 中创建一个集合,但使用分区/分片键,因为所需的配置是数据库将具有预配置的吞吐量(一定量的 RU),并且其中的集合将具有共享吞吐量。

集群的 API 设置为Cosmos DB Mongo API- 如果我在 cosmos 中创建集合,则插入/删除没有任何问题,但如果我使用下面的代码创建集合,我会收到一条错误消息,指出{"Command insert failed: document does not contain shard key."}即使查看在门户中创建的集合,在代码中看起来相同。

client.CreateDocumentCollectionAsync(database.SelfLink,
new DocumentCollection
{
    Id = "CollectionName",
    PartitionKey = new PartitionKeyDefinition { Paths = new Collection<string> { "/_id" } }
}).Wait();
Run Code Online (Sandbox Code Playgroud)

我已经与微软代表交谈过,但我缺乏“答案”。他建议使用Mongo CSharp Driver,但似乎该驱动程序无法定义分区键(这是有道理的)。

如何使用分区键创建集合?

谢谢。

c# azure-cosmosdb azure-cosmosdb-mongoapi

2
推荐指数
1
解决办法
5878
查看次数

宇宙数据库 SQL;Feed 选项上的分区键与分区键上的查询?

在 .net core sdk FeedOptions 中提供分区键与将其作为查询条件有什么区别?例如,如果您想列出给定分区键中的所有项目。您应该在条件中使用提要选项还是分区键?

标准中的分区键

SELECT * FROM c where c.PartitionKey = "some partition key"
Run Code Online (Sandbox Code Playgroud)

.net core 与 feedoptions

var allDocs = await (from d in client.CreateDocumentQuery<Document>(UriFactory.CreateDocumentCollectionUri(databaseId, "TestCollection"), 
                     new FeedOptions { PartitionKey = new PartitionKey("some partition key") })
                     select d)
                    .AsDocumentQuery<Document>().ExecuteNextAsync<Document>();
Run Code Online (Sandbox Code Playgroud)

当我创建自定义索引策略(其中分区键被排除在索引之外)时,出现了问题。因此,在查看 RU/s 成本时,它似乎在排除时进行扫描,而不是在使用默认索引策略时进行索引查找。

这是否意味着如果您需要跨分区查询,您需要索引分区键,如果您只需要在给定分区键内查询,您可以排除它 - 假设您在 FeedOptions 中给出分区键?

azure-cosmosdb azure-cosmosdb-sqlapi

2
推荐指数
1
解决办法
1004
查看次数

Cosmos DB 中分区键和项键的 GET 与查询

我正在阅读有关查询性能最佳实践的Cosmos DB 文档,发现以下内容含糊不清:

使用 Azure Cosmos DB,查询通常按以下顺序执行,从最快/最高效到较慢/效率较低。

  • 获取单个分区键和项目键
  • 使用单个分区键上的过滤子句进行查询
  • 对任何属性不使用等式或范围过滤子句的查询
  • 不带过滤器的查询

“单个分区键和项目键上的 GET”与“单个分区键和项目键上的查询”之间的性能或 RU 是否存在差异?我并不完全清楚这是否属于情况#1或#2,或者介于两者之间。

基本上,我问的是我们是否需要使用 GET。该文档似乎没有在任何地方澄清这一点。

azure azure-cosmosdb azure-cosmosdb-sqlapi

2
推荐指数
1
解决办法
1674
查看次数

使用 C# SDK 从 CosmosDb 中删除文档

我正在尝试使用下面的代码从 CosmosDB 中删除文档,但每次都会收到以下错误:“Microsoft.Azure.Documents.DocumentClientException:系统中不存在具有指定 ID 的实体”

该文档肯定在数据库中: 在此输入图像描述

这是我正在使用的代码:

    this.client = new DocumentClient(new Uri(EndpointUri), PrimaryKey);
    var docUri = UriFactory.CreateDocumentUri(DatabaseName, CollectionName, documentId);

    var result = await this.client.DeleteDocumentAsync(docUri, new RequestOptions { PartitionKey = new PartitionKey("/id") });
Run Code Online (Sandbox Code Playgroud)

有人知道可能是什么问题吗?

谢谢

c# azure-cosmosdb azure-cosmosdb-sqlapi

2
推荐指数
1
解决办法
1918
查看次数

Mongo Go 驱动程序 Count() 方法从 Azure CosmosDB MongoDB Api Count() 获取“服务器响应无效,值字段不是数字”

我在我的项目中使用 Azure Cosmos DB 和 MongoDB Api,该项目是使用 Golang 和 MongoDB Go 驱动程序开发的。当我尝试使用下面的代码获取计数时出现错误Invalid response from server, value field is not a number

itemCount, err := myCollection.CountDocuments(ctx, bson.D{{"$and", bson.A{bson.M{"userid": user.ID, "siteid": site.ID}}}})
Run Code Online (Sandbox Code Playgroud)

当我在 MongoDB 数据库上尝试时,相同的代码返回项目数(在本例中为 532)。然后,我决定通过编写一个简单的 .Net 应用程序来尝试相同的查询,该应用程序在 MongoDB 和 CosmosDB 上都运行良好。下面是我使用的代码,它532为两个数据库打印。

var count = database.GetCollection<Model>("myCollection").CountDocuments(filter);
Console.WriteLine(count);
Run Code Online (Sandbox Code Playgroud)

我还尝试通过 Robo3T 查询这两个数据库。该查询从 MongoDBdb.getCollection('Consents').count({})返回532,而同一查询NumberLong(532)从 CosmosDB 返回。

我将这一行为写到了 MSDN 论坛,但没有人信赖。我什至不确定这是数据库 API 还是驱动程序的问题。就驱动程序而言,它可以与 MongoDB 配合使用,这也是它向我承诺的。就数据库 api 而言,它与 .Net 驱动程序一起使用,它告诉我 Microsoft 很清楚这种行为,并发现它可以接受并在其驱动程序中处理它。有人知道如何克服这种情况吗?

go mongodb azure-cosmosdb azure-cosmosdb-mongoapi

2
推荐指数
1
解决办法
7976
查看次数

C# 获取 Cosmos 数据库中的容器列表

如何使用 C# 获取 Cosmos 数据库的容器列表

var client2 = new CosmosClient("https://MYCOSMOS.documents.azure.com:443/", "kpWBLj8jfN0qDPsdfsg1Amng==");
client2.GetDatabase("").GetContainer("");
Run Code Online (Sandbox Code Playgroud)

GetContainers()没有选项

azure-cosmosdb

2
推荐指数
1
解决办法
4410
查看次数

Cosmos DB 中的更改数据捕获

我希望通过 azure 函数或其他方式使用计划作业捕获 Cosmos DB(JSON 文档)中更改的数据,而不影响数据库的在线性能,因为 Web 应用程序/移动应用程序正在使用 API 调用将数据读取和写入到 Cosmos DB 中。我想要用于离线 ETL 和分析目的的数据,就像 Oracle 提供离线重做日志文件的方式一样。

azure-cosmosdb azure-cosmosdb-sqlapi

2
推荐指数
1
解决办法
1921
查看次数

如何在 Azure cosmosDB 中执行事务批量操作

最近,微软在 Azure CosmosDB 产品中引入了事务批量操作功能。在所有示例和每个文档中,似乎批次内的所有操作都需要位于同一分区中。想知道是否有办法实现跨分区的事务批处理操作。

我的用例是创建数千个文档,分区键是文档 ID。在每个操作中,我创建 2 个位于同一分区中的文档(具有相同的 id),并且我需要将它们作为事务的一部分来执行。我需要批处理数千个这样的操作。

azure azure-cosmosdb azure-cosmosdb-sqlapi

2
推荐指数
1
解决办法
1033
查看次数

Azure Function cosmosdb 环境设置

您好,我正在编写 Azure 函数触发器来捕获 cosmosdb 的更改。我面临着一个基本问题。

在 function.json 中,我想保持以下参数动态(应该从环境变量中选取)。原因是同一个应用程序将部署在多个环境中,并且它们可能具有不同的数据库名称。

      "databaseName": "CosmosDbName",
      "collectionName": "UserCollectionName",
Run Code Online (Sandbox Code Playgroud)

我尝试在 local.settings.json 中设置值来测试它,但失败并且没有选择值。

有什么建议 ?

找到了解决方案

      "databaseName": "%CosmosDbName%",
      "collectionName": "%UserCollectionName%",
Run Code Online (Sandbox Code Playgroud)

azure-functions azure-cosmosdb azure-function-app

2
推荐指数
1
解决办法
783
查看次数

Entity Framework Core 的 Cosmos 提供程序使用 DbContext 类名创建容器

我在 asp net core 3.1 应用程序中使用 Azure Cosmos DB 和 Microsoft.EntityFrameworkCore.Cosmos 包。在我的 OnModelCreating 方法的 AppContext 类中,我为每个 dbset ToContainer() 方法提供了定义容器的名称,否则它将为容器提供 AppContext 名称。一切正常,但它仍然在 CosmosDb 中创建一个容器 AppContext,我该如何解决这个问题?请帮忙。下面是我的代码。

应用上下文类

using Microsoft.AspNetCore.Identity;
using Microsoft.AspNetCore.Identity.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore;

namespace CosmosApp.Context
{
    public class AppContext : IdentityDbContext<AppUser>
    {
        public DbSet<Teacher> Teachers { get; set; }

        public DbSet<Student> Students { get; set; }

        public AppContext(DbContextOptions options)
            : base(options)
        {

        }

        protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
            base.OnModelCreating(modelBuilder);

            modelBuilder.Entity<IdentityUser>().ToContainer("Users");
            modelBuilder.Entity<AppUser>().ToContainer("Users");
            modelBuilder.Entity<IdentityUserRole<string>>().ToContainer("UserRoles");
            modelBuilder.Entity<IdentityUserLogin<string>>().ToContainer("UserLogins");
            modelBuilder.Entity<IdentityUserClaim<string>>().ToContainer("UserClaims");
            modelBuilder.Entity<IdentityRole>().ToContainer("Roles");
            modelBuilder.Entity<IdentityUserToken<string>>().ToContainer("UserTokens");

            modelBuilder.Entity<Teacher>().ToContainer("Teachers");
            modelBuilder.Entity<Student>().ToContainer("Students");
            modelBuilder.Entity<Teacher>().HasNoDiscriminator();
            modelBuilder.Entity<Student>().HasNoDiscriminator();
        } …
Run Code Online (Sandbox Code Playgroud)

c# asp.net-identity entity-framework-core asp.net-core azure-cosmosdb

2
推荐指数
1
解决办法
3976
查看次数