2012-06-28 8 views
3

J'ai une collection mongo fragmentée, avec des documents de plus de 1,5 mil. J'utilise la colonne _id en tant que clé shard, et les valeurs de cette colonne sont des entiers (plutôt que des ObjectIds).Documents en double sur _id (en mongo)

Je fais beaucoup d'opérations d'écriture sur cette collection, en utilisant le pilote Perl (insert, update, remove, save) et mongoimport.

Mon problème est que d'une manière ou d'une autre, j'ai des documents en double sur le même _id. D'après ce que j'ai lu, cela ne devrait pas être possible.

J'ai supprimé les doublons, mais d'autres apparaissent toujours.

Avez-vous des idées d'où pourraient-ils provenir, ou que devrais-je commencer à regarder? (De plus, j'ai essayé de répliquer ceci sur une plus petite collection de tests, mais aucun doublon n'est inséré, quelle que soit l'opération d'écriture que j'effectue).

Répondre

2

Ceci n'est en fait pas un problème avec le pilote Perl .. il est lié aux caractéristiques de sharding. MongoDB est seulement capable d'imposer l'unicité parmi les documents situés sur un seul fragment au moment de la création, donc l'index par défaut ne requiert pas d'unicité.

Dans la documentation MongoDB: Configuring Sharding il est fait mention spécifique:

  • Lorsque vous Shard une collection, vous devez spécifier la clé tesson. S'il y a des données dans la collection, mongo nécessitera la création d'un index en amont (cela accélère le processus de segmentation); sinon, un index sera créé automatiquement pour vous.

  • Vous pouvez utiliser l'option {unique: true} pour vous assurer que l'index sous-jacent impose l'unicité tant que l'index unique est un préfixe de la clé shard.

  • Si l'option "unique: vrai" n'est pas utilisée, la clé de partition n'a pas besoin d'être unique.

+0

Je viens de vérifier cela, et vous aviez raison ... l'option "unique: vrai" n'a pas été précisée :) Merci beaucoup, votre réponse a été extrêmement utile. –

+0

FYI, a remarqué qu'il y a un nouveau tutoriel: [MongoDB: Appliquer des clés uniques pour les collections Sharded] (http://docs.mongodb.org/manual/tutorial/enforce-unique-keys-for-sharded-collections/). – Stennie

1

Comment avez-vous implémenté la génération des entiers?

Si vous utilisez un système comme celui proposé sur le site Web de MongoDB, cela devrait aller. Pour référence:

function counter(name) { 
    var ret = db.counters.findAndModify({ 
     query:{_id:name}, 
     update:{$inc:{next:1}}, 
     "new":true, 
     upsert:true}); 

    return ret.next; 
} 

db.users.insert({_id:counter("users"), name:"Sarah C."}) // _id : 1 
db.users.insert({_id:counter("users"), name:"Bob D."}) // _id : 2 

Si vous générez vos Ids en lisant un enregistrement le plus récent dans le magasin de documents, incrémenter puis le numéro dans le code perl, puis insérer le numéro incrémentée, vous pouvez exécuter dans les problèmes de synchronisation.

+0

Voici quelques détails sur le processus: Je reçois des données quotidiennes, que je processus et insérer/mise à jour dans la collection. Pour la colonne _id, j'utilise le même id que je reçois de la source externe (à des fins de performance). –

Questions connexes