标签: azure-cosmosdb

CosmosDB 创建 - API 选项(SQL 与 Graph)

我对使用Azure CosmosDB的图形功能很感兴趣。查看文档,我看到它将图形顶点和边作为 JSON 文档(具有商定的架构)进行处理,因此可以作为普通的旧 DocumentDB 访问它。

考虑到这一点,您在创建新实例(链接)时需要进行的API选择的含义是什么?

例如:

  • 如果我将数据库创建为SQL (DocumentDB) 并通过客户端的图形部分(例如 CreateGremlinQuery)操作数据,我会失去什么
  • 如果我将数据库创建为图形并通过客户端的 DocumentDB 部分(例如 CreateDocumentAsync)操作数据,我会失去什么

更新:我知道门户差异(如下所述Jesse Carter)。我感兴趣的是,在 SQL(Document DB) 与 Graph 之间进行选择的特定场景中,此开关是否会驱动其他任何内容

gremlin azure-cosmosdb

5
推荐指数
1
解决办法
455
查看次数

MongoDB 数组排序在 CosmoDB 中不起作用

更新

CosmoDB 团队确认他们所说的存在问题,他们已经在着手修复。

此处评论部分的更多信息:https : //docs.microsoft.com/en-us/azure/cosmos-db/mongodb-introduction

原问题

我们正计划迁移到 CosmoDB,但我们发现 $sort 命令存在问题。在我们当前运行此查询的 MongoDB 服务器中:

db.getCollection('Product').find({ 
"ProductTypeId" : ObjectId("5913546b1ba88338e4347641"), 
"SubtypeIngredients" : "5949852c1ba88344d0facbf5"
})
.skip(0).sort({ "IngredientRanks.2.Rank" : 1 }).limit(1)
Run Code Online (Sandbox Code Playgroud)

我们得到了一些结果,但是在 CosmoDB 中运行相同的查询时,我们没有得到任何结果。

如果我从查询中删除排序命令,我会从 CosmoDB 获得结果

集合中的数据在我们本地db和CosmoDB中是一样的。

任何帮助,将不胜感激。谢谢!

更新:

这是显示问题的实际查询的屏幕截图。

在此处输入图片说明

mongodb azure-cosmosdb

5
推荐指数
1
解决办法
1222
查看次数

Azure CosmosDB IS_DEFINED 与 NOT IS_DEFINED

我试图查询一个文档很少的集合。有些集合具有“异常”属性,而有些则没有。
我的最终查询看起来像:

Records that do not contain Exception: 

**select COUNT(1) from doc c WHERE NOT IS_DEFINED(c.Exception)**  


Records that contain Exception: 

**select COUNT(1) from doc c WHERE IS_DEFINED(c.Exception)**
Run Code Online (Sandbox Code Playgroud)

但这似乎行不通。当 NOT IS_DEFINED 返回一些计数时,IS_DEFINED 返回 0 条记录,其中实际上有数据。

我的数据看起来像(某些文档可以包含 Exception 属性而其他文档则不包含):

[{
  'Name': 'Sagar',
  'Age': 26,
  'Exception: 'Object reference not set to an instance of the object', ...
},
{
  'Name': 'Sagar',
  'Age': 26, ...
}]
Run Code Online (Sandbox Code Playgroud)

azure-cosmosdb

5
推荐指数
2
解决办法
6886
查看次数

使用 Gremlin Graph API 在 azure cosmos db 中进行通配符或“LIKE”搜索

我试图在一种通配符搜索中搜索顶点。在 SQL 中,它将是:“其中名称像 '%abc%'”。Gremlin 图遍历和 SQL 查询都不支持它。

用例是过滤 1:n 依赖项,例如“向我显示名称包含 'Sam' 的所有客户”。这对于 SQL 来说是非常基本和容易的。它不是全面的全文搜索,而只是此特定 1:n 关系中的过滤器。

以下 SQL 有效:

SELECT * FROM g 
  where (g.label = "person" and g.name[0]._value = 'Sam')
Run Code Online (Sandbox Code Playgroud)

这相当于:

g.V().hasLabel("person").has("name", "Sam")
Run Code Online (Sandbox Code Playgroud)

以下 SQL 不起作用(“语法错误,'like' 附近的语法不正确):

SELECT * FROM g 
  where (g.label = "person" and g.name[0]._value like 'Sam')
Run Code Online (Sandbox Code Playgroud)

尝试在 Gremlin “过滤器”步骤中使用 lambda 也会导致错误。

为这种搜索编写 UDF 或存储过程是个好主意吗?在这种情况下如何处理索引?有没有其他选择?

非常感谢

gremlin azure-cosmosdb

5
推荐指数
1
解决办法
2519
查看次数

将记录插入到 Azure Cosmos DB 中文档内的数组中

我使用 Azure Cosmos DB 按以下格式存储数据。

{
    "id": "id",
    "name": "Name",
    "items": [
        {
            "id": "id",
            "name": "name"
        }
    ]
}
Run Code Online (Sandbox Code Playgroud)

我正在使用 Azure Functions 和 JavaScript 添加到此文档数据库中,并且按预期工作。

现在我想在数组中添加一个新产品products。在不重新创建整个文档的情况下,这甚至可能吗?

我真的很想发送两个这样的输入。

输入 1

{
    "id": "A",
    "name": "Name A",
    "items": [
        {
            "id": "01",
            "name": "Item A"
        }
    ]
}
Run Code Online (Sandbox Code Playgroud)

输入 2

{
    "id": "A",
    "name": "Name A",
    "items": [
        {
            "id": "02",
            "name": "Item B"
        }
    ]
}
Run Code Online (Sandbox Code Playgroud)

结果

{
    "id": "A",
    "name": "Name A",
    "items": [
        {
            "id": "01", …
Run Code Online (Sandbox Code Playgroud)

azure azure-functions azure-cosmosdb

5
推荐指数
1
解决办法
1621
查看次数

在 Cosmos DB 中存储具有动态属性的对象

我有一个消息处理器,我想在其中获取一堆带有已知模式包装器的 json,但其属性是一个动态对象,如下所示:

public class NotificationDetails
{
    [JsonProperty(PropertyName = "id")]
    public string NotificationID { get; set; }
    public DateTime? DateCreated { get; set; }
    public DateTime? DateSent { get; set; }
    public string TemplateUrl { get; set; }
    public dynamic Model { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

如您所见,最后一个属性是动态的。通知都将具有不同的模型模式,因此我希望将其存储为嵌套对象。

也就是说,当我尝试通过创建对象时

client.CreateDocumentAsync(UriFactory.CreateDocumentCollectionUri(DatabaseId, collectionId), item)
Run Code Online (Sandbox Code Playgroud)

我收到以下错误消息:

'MyClass.CreateNotification(NotificationDetails))' 的最佳重载方法匹配有一些无效参数

我以为我可以在这些文档中添加任何内容。我究竟做错了什么?对于这个模型属性,我应该使用动态以外的东西吗?

更新我发现这与我如何在从 DocumentClient 返回的任务上调用 Wait() 方法有关。一旦我恢复到异步等待策略,它就开始正常工作。

.net c# azure-cosmosdb

5
推荐指数
1
解决办法
2676
查看次数

Azure Cosmos DB 中托管的 MongoDB:分片与分区

我们希望将 MongoDB 用于我们的数据库,并且我们希望使用 MongoDB API 来避免“锁定”到 Azure Cosmos DB 托管。

我们使用 .Net Core 和 MongoDB.Driver 包(以便能够在本地、Atlas、Azure Cosmos hsoting 等之间轻松切换)与 MongoDB 实例进行通信,到目前为止一切顺利。

为了能够处理未来数据量(大小和性能)的增长,我希望对我的集合进行分片。据我了解,Cosmos DB 使用的策略是使用分区键进行分区,但由于我们使用 MongoDB.Driver,我无论如何都找不到在查询中指定分区键。

“Plain” MongoDB 使用分片代替,您可以设置一个文档属性,该属性应该用作数据分片方式的分隔符。

所以,我的猜测是分片是要走的路(因为 partionkeys 是 Cosmos 功能),但我无法让它工作。

Azure 门户中的“MongoDB shell”不理解 sh.shardCollection 命令,如果我从客户端连接 MongoDB shell,我会收到以下错误:

globaldb:PRIMARY> use sampledatabase
switched to db sampledatabase
globaldb:PRIMARY> sh.shardCollection("sampledatabase.Event", { TenantId: 1 } )
2018-06-21T12:03:06.522+0200 E QUERY    [thread1] Error: not connected to a mongos :
Run Code Online (Sandbox Code Playgroud)

如何继续在 Azure Cosmos 中托管的 MongoDB 实例中启动和运行分片?

partitioning sharding mongodb mongodb.driver azure-cosmosdb

5
推荐指数
1
解决办法
2225
查看次数

为什么我不应该将所有数据放在一个 CosmosDB 集合中?

问题

发现Cosmos DB 的定价非常高,如果与许多数据类型一起使用,可能会很昂贵。

我认为一个好的结构是将我拥有的每个数据类型放在他们自己的集合中,几乎就像数据库中的表(不完全是)。

但是,每个收款每月至少要花费 24 美元。这是如果我选择“固定”,这将我限制为 10GB 并且不可扩展。几乎不是 Cosmos DB 的重点,所以我宁愿选择“无限”。但是,这里的价格至少为每月 60 美元。

每个数据类型每月 60 美元。

这包括1000 RU,但除此之外,我必须为消费支付更多费用。

如果我有几种数据类型,这可能没问题,但如果我是一个完全成熟的业务应用程序,有 30 种数据类型(一点也不罕见),至少每月 1800 美元。作为起价。当我还没有数据的时候。

问题

集合中数据的结构并不严格。我可以在同一个集合中存储不同类型的文档。

使用“无限”集合时,我可以使用分区键,它应该用于对我的数据进行分区以确保可扩展性。

但是,为什么我不只在分区键中包含数据类型?

然后分区键变成这样:

[customer-id]-[data-type]-[actual-partition-value, like 'state']
Run Code Online (Sandbox Code Playgroud)

快速移动,我的最低成本变成了 60 美元,其余的基于消费。据推测,无论数据量如何,分区键都能确保令人满意的性能。那么我错过了什么?这种方法有问题吗?

更新

Microsoft 现在支持在所有容器之间共享 RU(没有最低 10000 RU),因此这个问题基本上不再相关,因为您现在可以自由选择将数据分离到不同的容器中,而无需任何额外费用。

azure azure-cosmosdb

5
推荐指数
1
解决办法
943
查看次数

如果我们已经将分区键设置到 FeedOption 中,查询是否应该包含分区键?

我正在使用带有分区键 =“deviceId”的文档数据库。下面的2个代码有什么不同:

var fo = new FeedOption{ PartitionKey= new PartitionKey("A1234") };
var partitionKeyInQuery= dbClient.CreateDocumentQuery(d => d.deviceId = "A1234" and d.type==1, fo);
var noPartitionKeyInQuery = dbClient.CreateDocumentQuery(d => d.type==1, fo);
Run Code Online (Sandbox Code Playgroud)

在 FeedOption 中应用 PartitionKey 时,我应该在 WHERE 子句中添加“deviceId”吗?

linq performance azure-cosmosdb

5
推荐指数
1
解决办法
631
查看次数

Azure Cosmos DB:503 服务不可用

当从公司网络外部的代码进行连接时,Cosmos DB 连接工作得很好。但从公司网络来看,它会抛出一个503 ServiceUnavailable状态代码。可能出现哪些问题?

azure azure-cosmosdb

5
推荐指数
1
解决办法
7916
查看次数