获取'查询命令必须针对单个分片'

时间:2018-05-01 06:30:34

标签: azure-cosmosdb azure-cosmosdb-mongoapi

我使用Mongo API进行了CosmosDB设置。我在文档的一个字段上有一个带有散列碎片的集合。当我运行db.collection.removedb.collection.deleteMany等命令时,我收到以下错误。

Command deleteMany failed: query in command must target a single shard key.: {"message":"Command deleteMany failed: query in command must target a single shard key."}

我不确定如何将查询作为查询的一部分提及分片密钥,我希望查询能够在所有分片中运行。

3 个答案:

答案 0 :(得分:1)

如果要运行db.collection.removedb.collection.deleteMany等命令,则需要提供共享密钥。

例如:

我的数据来源如下:

[
    {
        "id" : "2",
        "name" : "b"
    },
    {
        "id" : "1",
        "name" : "a"
    }
]

我的共享密钥是"/name"。使用db.coll.deleteMany({"name":"a"})删除特定分片。

enter image description here

希望它对你有所帮助。

答案 1 :(得分:0)

应该是您在创建cosmosDb集合时选择的ShardKey。

FilterDefinition<Product> filter = Builders<Product>.Filter.Eq("id", 2);
=== 2是我的shardKey

await this._dbContext.GetProducts.DeleteOneAsync(filter);
return RedirectToAction("Index");

请参考下面的图像,它在CosmosDB中的外观如何

enter image description here

答案 2 :(得分:0)

在代码中指定模式模型期间必须提供

Shard Key(分区键)。提供后,我们可以像往常一样执行常规操作,例如保存,更新和删除。

示例:

const mySchema = new Schema({
    requestId: { type: String, required: true },
    data: String,
    documents: [{ docId: String, name: String, attachedBy: String }],
    updatedBy: {
        type: {
            name: { type: String, required: true },
            email: { type: String, required: true },
        }, required: true
    },
    createdDate: { type: Date, required: true },
    updatedDate: { type: Date },
}, { shardKey: { requestId: 1 } }
);

在上面的代码中,我们将requestId指定为Shard Key,现在我们可以执行任何mongo操作 示例:

let request:any = await myModel.findById(requestId);
request.data ="New Data";
await request.save();

希望有帮助。

这适用于所有Mongo操作