示例#1
0
    def create_index(self, sort_fields, **kwargs):
        if not isinstance(sort_fields, qf.sort):
            raise TypeError("sort_fields must be an instance of filter.sort")

        if "name" not in kwargs:
            name = self._gen_index_name(sort_fields["orderby"])
        else:
            name = kwargs.pop("name")

        key = SON()
        for k,v in sort_fields["orderby"]:
            key.update({k:v})

        index = SON(dict(
          ns=str(self),
          name=name,
          key=key
        ))

        if "drop_dups" in kwargs:
            kwargs["dropDups"] = kwargs.pop("drop_dups")

        if "bucket_size" in kwargs:
            kwargs["bucketSize"] = kwargs.pop("bucket_size")
        
        index.update(kwargs)
        yield from self._database.system.indexes.insert(index, safe=True)
        return name
示例#2
0
    def find_and_modify(self, query=None, update=None, upsert=False, **kwargs):
        if not update and not kwargs.get('remove', None):
            raise ValueError("Must either update or remove")

        if update and kwargs.get('remove', None):
            raise ValueError("Can't do both update and remove")

        cmd = SON([("findAndModify", self._collection_name)])
        cmd.update(kwargs)
        # No need to include empty args
        if query:
            cmd['query'] = query
        if update:
            cmd['update'] = update
        if upsert:
            cmd['upsert'] = upsert

        result = yield from self._database["$cmd"].find_one(cmd)
        no_obj_error = "No matching object found"
        if not result['ok']:
            if result["errmsg"] == no_obj_error:
                return None
            else:
                raise ValueError("Unexpected Error: %s" % (result,))
        return result.get('value')
示例#3
0
    def find_and_modify(self, query=None, update=None, upsert=False, **kwargs):
        if not update and not kwargs.get('remove', None):
            raise ValueError("Must either update or remove")

        if update and kwargs.get('remove', None):
            raise ValueError("Can't do both update and remove")

        cmd = SON([("findAndModify", self._collection_name)])
        cmd.update(kwargs)
        # No need to include empty args
        if query:
            cmd['query'] = query
        if update:
            cmd['update'] = update
        if upsert:
            cmd['upsert'] = upsert

        result = yield from self._database["$cmd"].find_one(cmd)
        no_obj_error = "No matching object found"
        if not result['ok']:
            if result["errmsg"] == no_obj_error:
                return None
            else:
                raise ValueError("Unexpected Error: %s" % (result, ))
        return result.get('value')
示例#4
0
    def map_reduce(self, map, reduce, full_response=False, **kwargs):

        cmd = SON([("mapreduce", self._collection_name), ("map", map), ("reduce", reduce)])
        cmd.update(**kwargs)
        result = yield from self._database["$cmd"].find_one(cmd)
        if full_response:
            return result
        return result.get("result")
示例#5
0
    def map_reduce(self, map, reduce, full_response=False, **kwargs):

        cmd = SON([("mapreduce", self._collection_name), ("map", map),
                   ("reduce", reduce)])
        cmd.update(**kwargs)
        result = yield from self._database["$cmd"].find_one(cmd)
        if full_response:
            return result
        return result.get("result")
示例#6
0
    def create_collection(self, name, options=None):
        collection = Collection(self, name)

        if options:
            if "size" in options:
                options["size"] = float(options["size"])

            command = SON({"create": name})
            command.update(options)
            result = yield from self["$cmd"].find_one(command)
            if result.get("ok", 0.0):
                return collection
            else:
                raise RuntimeError(result.get("errmsg", "unknown error"))
        else:
            return collection
示例#7
0
    def create_collection(self, name, options=None):
        collection = Collection(self, name)

        if options:
            if "size" in options:
                options["size"] = float(options["size"])

            command = SON({"create": name})
            command.update(options)
            result = yield from self["$cmd"].find_one(command)
            if result.get("ok", 0.0):
                return collection
            else:
                raise RuntimeError(result.get("errmsg", "unknown error"))
        else:
            return collection
示例#8
0
    def create_index(self, sort_fields, **kwargs):
        if not isinstance(sort_fields, qf.sort):
            raise TypeError("sort_fields must be an instance of filter.sort")

        if "name" not in kwargs:
            name = self._gen_index_name(sort_fields["orderby"])
        else:
            name = kwargs.pop("name")

        key = SON()
        for k, v in sort_fields["orderby"]:
            key.update({k: v})

        index = SON(dict(ns=str(self), name=name, key=key))

        if "drop_dups" in kwargs:
            kwargs["dropDups"] = kwargs.pop("drop_dups")

        if "bucket_size" in kwargs:
            kwargs["bucketSize"] = kwargs.pop("bucket_size")

        index.update(kwargs)
        yield from self._database.system.indexes.insert(index, safe=True)
        return name