def dbref_test(self): db = Database(self._get_connection(), "pymongo_test") try: db.create_collection('owners') db.create_collection('tasks') db.create_collection('tasks_ref') # owners and tasks db.owners.insert({"name":"Jim"}) db.tasks.insert([ {"name": "read"}, {"name": "sleep"} ]) # update jim with tasks: reading and sleeping reading_task = db.tasks.find_one({"name": "read"}) sleeping_task = db.tasks.find_one({"name": "sleep"}) jim_update = db.owners.find_one({"name": "Jim"}) jim_update["tasks"] = [ DBRef(collection = "tasks", id = reading_task["_id"]), DBRef(collection = "tasks", id = sleeping_task["_id"]) ] db.owners.save(jim_update) # get jim fresh again and display his tasks fresh_jim = db.owners.find_one({"name":"Jim"}) print "tasks are:" for task in fresh_jim["tasks"]: print db.dereference(task)["name"] db.tasks_ref.insert( { "ref" : DBRef(collection = "tasks", id = reading_task["_id"]) }) db.tasks_ref.insert( { "ref" : DBRef(collection = "tasks", id = sleeping_task["_id"]) }) r1 = db.tasks_ref.find( { "ref" : DBRef(collection = "tasks", id = reading_task["_id"]) }) print r1.count() finally: db.drop_collection('owners') db.drop_collection('tasks') db.drop_collection('tasks_ref')
def resolve_object_ids(self, mongo_object): if mongo_object is None: return None if type(mongo_object) is "dict": result = { } for key in mongo_object: result[key] = self.resolve_object_ids(mongo_object[key]) if key is not "_id" else mongo_object[key] return result elif type(mongo_object) is "list": result = [] for item in mongo_object: result.append(self.resolve_object_ids(item)) return result elif type(mongo_object) is "bson.objectid.ObjectId": return self.get_single(mongo_object) elif type(mongo_object) is "bson.dbref.DBRef": return Database.dereference(mongo_object)
def encode_model(obj, recursive=False): if obj is None: return obj if isinstance(obj, (Document, EmbeddedDocument)): out = dict(obj._data) for k, v in out.items(): if isinstance(v, ObjectId): if k is None: del(out[k]) else: # Unlikely that we'll hit this since ObjectId is always NULL key out[k] = str(v) else: out[k] = encode_model(v) elif isinstance(obj, ModuleType): out = None elif isinstance(obj, groupby): out = [(gb, list(l)) for gb, l in obj] elif isinstance(obj, (list)): out = [encode_model(item) for item in obj] elif isinstance(obj, (dict)): out = dict([(k, encode_model(v)) for (k, v) in obj.items()]) elif hasattr(obj, 'isoformat'): out = obj.isoformat() elif isinstance(obj, ObjectId): return None elif isinstance(obj, (str, unicode, int)): out = obj elif isinstance(obj, float): out = str(obj) elif isinstance(obj, DBRef): db = Database(g.db, 'listenitlater') obj_deref = Database.dereference(db, obj) out = encode_model(obj_deref) else: raise TypeError, "Could not JSON-encode type '%s': %s" % (type(obj), str(obj)) return out
# connect connection = Connection() db = Database(connection, "things") # clean up db.owners.remove() db.tasks.remove() # owners and tasks db.owners.insert({"name": "Jim"}) db.tasks.insert([{"name": "read"}, {"name": "sleep"}]) # update jim with tasks: reading and sleeping reading_task = db.tasks.find_one({"name": "read"}) sleeping_task = db.tasks.find_one({"name": "sleep"}) jim_update = db.owners.find_one({"name": "Jim"}) jim_update["tasks"] = [ DBRef(collection="tasks", id=reading_task["_id"]), DBRef(collection="tasks", id=sleeping_task["_id"]) ] db.owners.save(jim_update) # get jim fresh again and display his tasks fresh_jim = db.owners.find_one({"name": "Jim"}) print "Jim's tasks are:" for task in fresh_jim["tasks"]: print db.dereference(task)["name"]