我正在调查使用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)时,我收到错误“文档不包含分片键”。
我已经尝试过每一个我能想到的方式,并且每当我被这个错误拒绝时。我误解了这是如何工作,或做错了什么?
答案 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" } } )
)中提到的命令创建集合,则错误消失了。
这意味着要为集合提供分区键,我需要:
sender.postCode
)无论如何,该分区似乎总是可以在Azure门户中正常工作。
此处提到的$v
前缀不再存在。
答案 3 :(得分:0)
答案 4 :(得分:0)
我试图通过使用此处提到的不同方式创建集合来解决此问题。就我而言,不幸的是没有任何帮助。最终,我修改了此示例https://github.com/Azure-Samples/azure-cosmos-db-mongodb-dotnet-getting-started,该示例在插入时自动创建了collecton。