2012-07-04 6 views
1

Je suis nouveau dans mongodb et ne trouve pas la solution.MongoDB: documents en double dans la collection

J'utilise mongo-php-driver

Je viens de créer une collection. Je veux créer un document à partir du code PHP.

$collection->create(array(
    'asda'=>12312, 
    'cxzcxz'=>'czczcxz' 
)); 

Lorsque ce code fonctionne, il existe deux enregistrements identiques dans la collection, avec un _id différent.

{ "_id" : ObjectId("4ff4b3b8859183d41700000f"), "asda" : 12312, "cxzcxz" : "czczcxz" } 
{ "_id" : ObjectId("4ff4b3b8859183d417000010"), "asda" : 12312, "cxzcxz" : "czczcxz" } 

Comment réparer, et ce que je dois changer ici pour avoir un seul document?

J'ai l'index _id dans le tableau. Peut-être que je dois mettre cette clé à chaque fois? Quand j'ai mis _id champ, il a enregistré un enregistrement dans la collection. Mais comment le rendre automatique (comme l'incrémentation automatique)?

+0

spécifier quelle bibliothèque que vous utilisez pour vous connecter à MongoDB de php –

+0

que. https://github.com/mongodb/mongo-php-driver/downloads des documents officiels mongo –

+0

ne devrait pas être insérer au lieu de créer? –

Répondre

3

Vous pouvez insérer plus d'un enregistrement avec des informations similaires, car vous n'avez spécifié aucun index unique pour l'une de ces valeurs. Le default unique index sera sur _id.

Vous pouvez définir votre propre index à partir de PHP en utilisant MongoCollection.ensureIndex par exemple:

// create a unique index on 'phonenum' 
$collection->ensureIndex(array('phonenum' => 1), array("unique" => true)); 

Il est également intéressant de lire la documentation MongoDB sur unique indexes comme il y a quelques mises en garde à connaître si un index unique est créé pour une collection existante qui peut déjà avoir des doublons ou des valeurs nulles.

Vous avez également la possibilité de fournir votre propre valeur _id s'il existe une clé primaire plus naturelle à utiliser. Vous devrez vous assurer que ce _id est unique pour de nouvelles insertions, cependant.

La valeur par défaut ObjectID créée par MongoDB est conçue pour avoir une probabilité raisonnablement élevée d'être unique lorsqu'elle est allouée.

Exemple de code:

<?php 

// Connect to MongoDB server 
$mongo = new Mongo(); 

// Use database 'mydb' and collection 'mycoll' 
$collection = $mongo->mydb->mycoll; 

// Drop this collection for TESTING PURPOSES ONLY 
$collection->drop(); 

// The document details to insert 
$document = array(
    'asda' => 12312, 
    'cxzcxz' => 'czczcxz', 
); 

try { 
    $collection->insert($document, array("safe" => true)); 

    // Note that $collection->insert() adds the _id of the document inserted 
    echo "Saved with _id:", $document['_id'], "\n"; 
} 
catch (MongoCursorException $e) { 
    echo "Error: " . $e->getMessage()."\n"; 
} 

// Add unique index for field 'asda' 
$collection->ensureIndex(array('asda' => 1), array("unique" => true)); 

// Try to insert the same document again 
$document = array(
    'asda' => 12312, 
    'cxzcxz' => 'czczcxz', 
); 
try { 
    $collection->insert($document, array("safe" => true)); 
    echo "Saved with _id:", $document['_id'], "\n"; 
} 
catch (MongoCursorException $e) { 
    echo "Error: " . $e->getMessage()."\n"; 
} 

?> 
+0

Puis-je faire un champ auto_increment? Ou quelque chose comme ça. Pour ajouter un peu d'enregistrement à la collection, je devrai connaître un nouvel identifiant, comment l'obtenir? –

+0

ObjectID de MongoDB sert un objectif similaire à un champ d'auto-incrémentation: fournir un identifiant unique généré automatiquement. Une fois que vos données commencent à être distribuées sur plusieurs serveurs via [jeux de réplicas] (http://www.mongodb.org/display/DOCS/Replica+Sets#ReplicaSets-Overview) et [sharding] (http: //www.mongodb. org/display/DOCS/Sharding + Introduction) le concept d'une séquence de nombres auto-incrémentés centralisée n'est plus pertinent si vous voulez que les écritures se déroulent indépendamment dans votre cluster. – Stennie

+0

@NikitaKuhta Si vous n'indiquez pas de _id_ lors de l'insertion d'un nouveau document, un ObjectID par défaut sera affecté. C'est exactement ce que vous voyez dans votre exemple de requête dans le message original. Vous avez inséré deux enregistrements et les ObjectIDs par défaut ont été ajoutés par le serveur MongoDB. – Stennie

Questions connexes