web-dev-qa-db-ja.com

「クエリ内のクエリは単一のシャードをターゲットにする必要があります」を取得する

Mongo APIを使用してCosmosDBを設定しています。ドキュメントのフィールドの1つにハッシュされたシャードのコレクションがあります。 db.collection.removeまたはdb.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."}

クエリをすべてのシャードで実行することを検討しているので、クエリの一部としてシャードキーをどのように説明できるかわかりません。

6
Zabi

_db.collection.remove_や_db.collection.deleteMany_などのコマンドを実行する場合は、シャードキーを指定する必要があります。

例えば ​​:

以下の私のデータソース:

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

そして、私の共有鍵は_"/name"_です。特定のシャードを削除するには、db.coll.deleteMany({"name":"a"})を使用します。

enter image description here

お役に立てば幸いです。

1
Jay Gong

コードでスキーマモデルを指定する際に、シャードキー(パーティションキー)を指定する必要があります。それが提供されると、保存、更新、削除などの通常の操作を通常どおり実行できます。

例:

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をシャードキーとして指定したので、mongo操作を実行できます。例:

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

お役に立てば幸いです。

これはすべてのMongo操作で機能します

0
Ganesh

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

0
Sachin Kalia