2012-12-10 1 views
0

Je viens de commencer à apprendre mongodb, et je ne sais pas encore beaucoup.comment désactiver '_id' dans pymongo

donc mon code:

#! /usr/bin/env python2.7 

import pymongo 
import datetime 

class AccountsDB(): 
    def __init__(self): 
     self.store_info() 

    def store_info(self): 
     try: 
      conn = pymongo.Connection('localhost', 27017) 
      db_name = 'accountsdb' 
      coll_name = 'user_info' 

      db = conn[db_name] 
      coll = db[coll_name] 

      print "Successfully connected to '%s'" % db_name 

      for i in xrange(20): 
       post = { 
        'f_name' : 'Sergey', 
        'l_name' : 'Ivanov', 
        'number' : '777-9-777', 
        'user_id': i 
       } 
       coll.insert(post) 

      print "Done" 
     except: 
      print "Can't connect to the database" 


if __name__ == "__main__": 
    acc = AccountsDB() 

et il me donne:

> db.user_info.find() 
{ "_id" : ObjectId("50c64872bdbff34435192a94"), "l_name" : "Ivanov", "f_name" : "Sergey", "user_id" : 0, "number" : "777-9-777" } 
{ "_id" : ObjectId("50c64872bdbff34435192a95"), "l_name" : "Ivanov", "f_name" : "Sergey", "user_id" : 1, "number" : "777-9-777" } 
{ "_id" : ObjectId("50c64872bdbff34435192a96"), "l_name" : "Ivanov", "f_name" : "Sergey", "user_id" : 2, "number" : "777-9-777" } 
{ "_id" : ObjectId("50c64872bdbff34435192a97"), "l_name" : "Ivanov", "f_name" : "Sergey", "user_id" : 3, "number" : "777-9-777" } 
{ "_id" : ObjectId("50c64872bdbff34435192a98"), "l_name" : "Ivanov", "f_name" : "Sergey", "user_id" : 4, "number" : "777-9-777" } 
{ "_id" : ObjectId("50c64872bdbff34435192a99"), "l_name" : "Ivanov", "f_name" : "Sergey", "user_id" : 5, "number" : "777-9-777" } 

and so on.... 

Mais je veux me débarrasser de '_id' et utiliser 'user_id' au lieu que ma clé primaire. Je suis assez sûr que cela peut être fait, mais je ne sais pas comment.

Répondre

1

Je suis assez sûr que la réponse est non, vous ne pouvez pas désactiver "_id". Pourquoi? suffit de jeter un oeil à la source code of pymongo. Jetez un oeil à collection.py et recherchez "_id". Mmm Je pense que cela pourrait être fait par patch de singe, mais c'est à la magie noire. juste une idée et je ne recommande pas de patchs de singe du tout. C'est pourquoi ma réponse est non :(

+0

donc je devrais simplement utiliser 'user_id' et' oublier _id'? – Vor

+0

Quand je dis non, je signifie que vous ne pouvez pas désactiver "_id", mais si vous pouvez vivre avec, vous pouvez avoir à la fois "user_id" et "_id". mais pymongo utilise _id pour stocker des objets – llazzaro

+0

ohh l'autre façon est de fourche pymongo mettre en œuvre ce que vous avez besoin et envoyer une demande de traction :). ou mieux d'abord demander à ce pymongo ppl – llazzaro

1

Faites ceci:

post = { 
      'f_name' : 'Sergey', 
      'l_name' : 'Ivanov', 
      'number' : '777-9-777', 
      '_id': i 
} 

Avec MongoDB, vous utilisez juste « _id » comme la clé de la valeur, et il utilisera la valeur que vous fournissez au lieu de auto générer un.

Ou, il suffit de créer un index sur user_id et la marquer comme « unique »

db.collection.createIndex({"user_id":1}, {unique:true}) 
+0

Je pense qu'il veut utiliser 'user_id' au lieu de '_id' – llazzaro

+0

Merci beaucoup – Vor

+0

@llazaro cela ne peut pas être fait, parce que l'existence de _id est appliquée du côté serveur. Cependant, vous êtes libre de créer des index uniques supplémentaires sur n'importe quel champ: http://www.mongodb.org/display/DOCS/Indexes – mpobrien