2012-10-19 5 views
0

Je cherche à shard ma base de données, mais j'ai un problème avec findAndModifyMongoDB Sharding findAndModify

J'ai un schéma qui ressemble à ceci (myCollection):

{ 
    "_id": "508206a9f6ded00c50f59469" 
    "DatabaseId" : 91, 
    "TypeId" : "5e62603c-8", 
    "ItemId" : "734", 
    "UserId" : "d14e3afd-d8b3-4c37-87cd-db5d89291c44" 
} 

Je suis en train mon shardkey comme ceci:

db.runCommand({enablesharding:"myDb"}); 
db.runCommand({ 
    shardcollection: "myDb.myCollection", 
    key: { 
     "DatabaseId" : 1, 
     "TypeId" : 1, 
     "ItemId" : 1 
    } 
}); 

Disons que le schéma ci-dessus est inséré dans la base de données.

J'exécuter cette requête:

db.myCollection.findAndModify({ 
    query: { 
     "DatabaseId" : 91, 
     "TypeId" : "5e62603c-8", 
     "ItemId" : "734", 
     "UserId" : "d14e3afd-d8b3-4c37-87cd-db5d89291c44" 
    }, 
    remove: true 
}); 

Je reçois cette erreur de courir le findAndModify:

findAndModifyFailed failed: { 
    "errmsg" : "exception: query for sharded findAndModify must have shardkey", 
    "code" : 13343, 
    "ok" : 0 
} 

Quelqu'un peut-il me expliquer pourquoi son dire cela? ou une solution pour cela? Il me semble que je fais tout ce dont j'ai besoin.

Répondre

2

Votre clé de partition a trois champs: ID de base de données, ID de type et ID d'élément.

Mongo vous dit que vous ne pouvez pas faire un findAndModify avec juste databaseId. Je ne sais pas pourquoi.

Vous avez besoin quelque chose comme:

db.myCollection.findAndModify({ 
query: { 
    "DatabaseId" : 91, 
    "TypeId": "blah", 
    "itemId": "foo" 
    "GroupId" : "5e62603c-8", 
    "Identifier" : "734", 
    "UserId" : "d14e3afd-d8b3-4c37-87cd-db5d89291c44" 
}, 
remove: true 

});

+0

Je suis désolé, GroupId et Identifiant == TypeId et ItemId. J'ai fait le changement dans ma question. – ehftwelve

+1

Selon: http://docs.mongodb.org/manual/reference/method/db.collection.findAndModify/#sharded-collections "Lors de l'utilisation de findAndModify dans un environnement partitionné, la requête doit contenir la clé shard pour toutes les opérations le cluster de partition pour les collections partagées. " – Sebastian

0

Pour développer la réponse de ptyx:

Le docs sur findAndModify disent qu'il échouera pour un cluster si la requête fragmentées ne contient pas la clé de tesson. Puisque vous utilisez une clé de partition composée, vous devrez peut-être inclure les trois champs dans la requête. (Voir le paragraphe rouge en bas).

+0

J'ai mal écrit ma question. Je suis désolé. J'utilise tous les trois dans la requête findAndRemove – ehftwelve

Questions connexes