Ejemplo n.º 1
0
    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')
Ejemplo n.º 2
0
    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)
Ejemplo n.º 3
0
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
Ejemplo n.º 4
0
# 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"]