import { Query } from 'blow-query';
import { Observable } from 'rxjs';
import * as mongodb from 'mongodb';
import { DataConnector } from './DataConnector';
import { Entity } from '../Entity';
export interface ConnectOptions {
    uriDecodeAuth: boolean;
    db: Object;
    server: Object;
    replSet: Object;
    mongos: Object;
}
export declare class MongoClient {
    static connect(url: string, options?: ConnectOptions): Observable<Db>;
}
export declare class Db {
    protected _db: mongodb.Db;
    constructor(db: mongodb.Db);
    collection<T>(name: string): Collection<T>;
    delete(): Observable<{}>;
    close(): Observable<boolean>;
}
export declare class Collection<T> {
    protected _collection: mongodb.Collection;
    constructor(collection: mongodb.Collection);
    find(query?: any): Observable<T>;
    count(query?: any): Observable<number>;
    delete(query?: any): Observable<number>;
    insert(doc: any): Observable<T>;
    update(query: any, doc: any, options?: any): Observable<T>;
}
export declare class MongoDBConnector extends DataConnector {
    protected _db: Db;
    protected _buildQueryWhereForId(id: string): {
        [key: string]: any;
    };
    protected _normalizeId(value: any): any;
    protected _prepareQueryWhere(queryWhere: {
        [key: string]: any;
    }): {
        [key: string]: any;
    };
    protected _collection<T>(collectionName: string): Collection<T>;
    connect(): Observable<MongoDBConnector>;
    disconnect(): Observable<MongoDBConnector>;
    destroyDb(): Observable<MongoDBConnector>;
    find<T>(collectionName: string, query?: Query): Observable<T>;
    count(collectionName: string, query?: Query): Observable<number>;
    delete(collectionName: string, query?: Query): Observable<number>;
    deleteById(collectionName: string, id: string): Observable<boolean>;
    get<T>(collectionName: string, id: string): Observable<T>;
    save<T>(collectionName: string, doc: Entity): Observable<T>;
    updateAttributes<T>(collectionName: string, id: string, attributes: Entity): Observable<T>;
}
