9

我有一个使用 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."}

考虑到我希望查询跨所有分片运行,我不确定如何在查询中提及分片键。

4

3 回答 3

1

当您想要运行类似db.collection.remove或的命令时,您需要提供分片键db.collection.deleteMany

例如 :

我的数据源如下:

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

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

在此处输入图像描述

希望它可以帮助你。

于 2018-05-02T08:40:49.017 回答
0

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

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

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

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

在此处输入图像描述

于 2019-07-31T09:21:20.147 回答
0

Shard Key(Partition 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 操作

于 2020-03-09T18:19:51.457 回答