web-dev-qa-db-fra.com

Obtenir «la requête dans la commande doit cibler un seul fragment»

J'ai une configuration CosmosDB utilisant l'API Mongo. J'ai une collection avec un fragment haché sur l'un des champs du document. Lorsque j'exécute des commandes comme db.collection.remove ou db.collection.deleteMany J'obtiens l'erreur suivante.

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."}

Je ne sais pas comment puis-je mentionner une clé de fragment dans le cadre de la requête, étant donné que je souhaite que la requête s'exécute sur tous les fragments.

6
Zabi

Vous devez fournir une clé de partition lorsque vous souhaitez exécuter des commandes comme db.collection.remove Ou db.collection.deleteMany.

Par exemple :

Ma source de données comme ci-dessous:

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

Et ma clé partagée est "/name". Utilisez db.coll.deleteMany({"name":"a"}) pour supprimer un fragment spécifique.

enter image description here

J'espère que cela vous aide.

1
Jay Gong

La clé de partition (clé de partition) doit être fournie lors de la spécification du modèle de schéma dans le code. Une fois qu'il est fourni, nous pouvons effectuer des opérations régulières comme enregistrer, mettre à jour et supprimer comme d'habitude.

Exemple:

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 } }
);

Dans le code ci-dessus, nous avons spécifié requestId comme clé d'éclat, maintenant nous pouvons effectuer toutes les opérations de mongo. Exemple:

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

J'espère que cela pourra aider.

Cela fonctionne avec toutes les opérations Mongo

0
Ganesh

Ce doit être ShardKey que vous avez choisi lorsque vous avez créé la collection cosmosDb.

FilterDefinition<Product> filter = Builders<Product>.Filter.Eq("id", 2);
=== 2 est ma shardKey

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

Veuillez vous référer à une image ci-dessous, à quoi ressemble-t-elle dans CosmosDB

enter image description here

0
Sachin Kalia