2011-07-31 6 views
1

J'essaie de configurer mongodb pour tester sa vitesse et je rencontre un problème avec la duplication _id. Je ne suis pas en train de régler le problème, je laisse le mongodb faire comme je m'en fous. J'ai le code php suivant:MongoDB _id Génération automatique de champ?

<?php 
$mongo = new Mongo(); 
$db = $mongo->selectDB("scrap_fighters"); 
$collection = $db->selectCollection('scores'); 

$data = array 
(
    'user_id' => 1, 
    'name' => 'John Doe', 
    'score' => 120 
); 

$start = microtime(true); 
for($x=0; $x < 1000; $x++) 
{ 
    $data['unqiue'] = microtime(); 
    $result = $collection->insert($data, array('safe' => true)); 
} 
?> 

Que mongodb utilise-t-il pour générer ses identifiants "uniques"? J'ai même essayé de remplacer unique:

$data['unqiue'] = rand(1, 1000000); 

Pour être 100% sûr qu'il travaillait mais il reste a échoué après la première écriture. est-ce que je ne peux pas entrer des enregistrements avec les mêmes données sans génération spécifique un identifiant unique moi-même?

Répondre

1

MongoDB utilise _id comme clé primaire, et en tant que telle, elle doit être unique. Puisque vous ne le spécifiez pas, il sera automatiquement généré. Il se compose d'un horodatage de microsecondes et d'un hachage basé sur l'hôte, de sorte que même si plusieurs hôtes insèrent simultanément la probabilité de collision est extrêmement faible.

Quel est ce champ unique que vous utilisez? Si vous vouliez que ce soit une clé primaire, ne le définissez pas. A propos de l'échec sur les doublons: la seule raison pour laquelle je peux penser à cela est que vous avez précédemment mis en place un index sur cette collection qui nécessite un champ (ou une combinaison de champs) pour être unique. Si ce n'est pas nécessaire, supprimez-le. Si c'est valide (par exemple: l'id_utilisateur doit être unique), insérez des enregistrements uniques.

+0

Le champ unique est _id et comme mon code le montre, je ne mets pas le _id automatiquement, ce qui explique pourquoi il est bizarre que le _id soit généré automatiquement avec des valeurs _id conflictuelles. C'est aussi une toute nouvelle collection (qui n'existe pas avant l'exécution du script), il n'y a donc pas d'autres index sur cette collection. – ryanzec

+0

drop collection, faites un var_dump ($ data) après l'insertion et vérifiez _id (s) généré. –

+1

REPONSE: hahaha, je n'ai pas réalisé que l'appel d'insertion a ajouté le _id au tableau. J'ai ajouté unset ($ data ['_ id']) à la fin et ça a bien fonctionné, merci. – ryanzec

Questions connexes