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

时间:2017-08-09 10:10:25

标签: c# azure azure-cosmosdb

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

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

据我所知Microsofts documentation,这个分区键应该与我插入的每个文档中的属性相关,所以我试图插入一个基本文档,如下所示:

  @Override
    public void onBindViewHolder(ViewHolder holder, int position) {
        ImageList imageList = imageLists.get(position);
        ImageView imageView = holder.imageView;
        File imgFile = new File(imageList.path);
        if(imgFile.exists()) {
            Picasso.with(context).load(imgFile).resize(230, 100)
                    .centerCrop().placeholder(R.mipmap.ic_launcher).into(imageView);
        }

    }

然而,当我尝试插入它(通过Mongo C#驱动程序或通过MongoChef)时,我收到错误“文档不包含分片键”。

enter image description here

我已经尝试过每一个我能想到的方式,并且每当我被这个错误拒绝时。我误解了这是如何工作,或做错了什么?

5 个答案:

答案 0 :(得分:2)

In the documentation Microsoft声称使用此命令通过mongo shell创建集合

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

我用它来创建一个集合,它现在按预期工作(带有rateId属性的文档插入ok,没有我得到“没有分片键”错误)。

在Azure门户中查看集合时,它会将分片键显示为

$v.rateId.$v

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

rateId

至少我现在可以进步了,但是我很困惑为什么它会这样做或者这是怎么回事(我在文档中看不到任何提及这种“$ v”格式)

答案 1 :(得分:0)

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

使用的AZ CLI版本2.0.59

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

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

BTW:这应该在以前的AZ CLI版本中有效(请参阅:https://github.com/Azure/azure-cli/issues/8633

答案 2 :(得分:0)

我在这里收到了相同的错误消息。 Azure CosmosDB,MongoDB api。

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

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

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

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

无论如何,该分区似乎总是可以在Azure门户中正常工作。

此处提到的$v前缀不再存在。

答案 3 :(得分:0)

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

enter image description here

答案 4 :(得分:0)

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