繁体   English   中英

ComosDB-MongoAPI-文档不包含分片键

[英]ComosDB - MongoAPI - Document does not contain shard key

我正在使用CosmosDB(以前是DocumentDB)进行调查,我们目前使用MongoDB,因此我试图将MongoAPI用于CosmosDB。

我已经在azure中创建了一个CosmosDB部署,创建了一个集合,并指定了“ / rateId”分区键。

据我从Microsoft的文档可以理解,此分区键应与我插入的每个文档中的一个属性有关,因此我尝试插入一个基本文档,如下所示:

{
    "rateId": "test.1",
    "val": "test2"
}

但是,当我尝试插入此文件(通过Mongo C#驱动程序或通过MongoChef)时,出现错误“文档不包含分片键”。

在此处输入图片说明

我已经尽我所能地尝试了此方法,并且每次都因该错误而被拒绝。 我是在误解这是怎么工作的,还是做错了什么?

微软在文档中说使用此命令通过mongo shell创建集合

db.runCommand( { shardCollection: "myDb.myCollection", key: { rateId: "hashed" } } )

我用它来创建一个集合,它现在可以按预期的方式工作(具有rateId属性的文档插入ok,而没有得到“ no shard key”错误)。

在Azure门户中查看集合时,分片密钥显示为

$v.rateId.$v

而当我通过门户网站创建集合并指定/ rateId作为分区时,它显示为

rateId

至少我现在可以进步了,但是我很困惑为什么它会这样运行,或者这就是它的原意(我在文档中看不到这种“ $ v”格式的提及)

通过玩转义字符,我设法找到了如何使用az cli编写partition-key-path的方法。

二手AZ CLI版本2.0.59

$paritionKeyPath = '/''$v''' + $path + '/''$v'''
az cosmosdb collection create .... --partition-key-path $partitionKeyPath

其中path是您在文档中以斜杠(即“ / foo”)开头的路径

顺便说一句:这应该在以前的AZ CLI版本中起作用(请参阅: https : //github.com/Azure/azure-cli/issues/8633

我在这里结束了同样的错误消息。 Azure CosmosDB,MongoDB api

如果使用Azure CLI创建集合,则会收到错误消息。

另一方面,如果我使用接受的答案中提到的命令来创建集合( db.runCommand( { shardCollection: "myDb.myCollection", key: { rateId: "hashed" } } ) ),则错误消失了。

这意味着为了为集合提供分区键,我需要:

  1. 通过MongoDB创建集合,指定用点分隔的分区键路径(例如sender.postCode
  2. 使用AZ CLI以所需的吞吐量更新它

无论如何,该分区似乎总是可以从Azure的门户进行工作。

这里提到的$v前缀不再出现在任何地方。

当我们忘记在文档中插入值时为分片键输入值时,就会出现此问题。 这意味着一旦我们为文档声明了Shard键,它就应该是要插入的模型的一部分。 请参考以下图片:

在此处输入图片说明

我试图通过创建这里提到的其他方式来解决这个问题。 就我而言,不幸的是没有任何帮助。 最终,我修改了此样本https://github.com/Azure-Samples/azure-cosmos-db-mongodb-dotnet-getting-started ,该样本在插入时自动创建了collecton。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM