blow-data-service
Version:
Observable data service for Blow.
73 lines (72 loc) • 2.09 kB
JavaScript
;
const rxjs_1 = require('rxjs');
const mongodb = require('mongodb');
exports.ObjectID = mongodb.ObjectID;
class MongoClient {
static connect(url, options) {
return rxjs_1.Observable.from(mongodb.MongoClient.connect(url, options))
.map(db => new Db(db));
}
}
exports.MongoClient = MongoClient;
class Db {
constructor(db) {
this._db = db;
}
collection(name) {
return new Collection(this._db.collection(name));
}
close() {
return rxjs_1.Observable.from(this._db.close());
}
}
exports.Db = Db;
class Collection {
constructor(collection) {
this._collection = collection;
}
find(query) {
query = Object.assign({}, { where: {} }, query || {});
let cursor = this._collection.find(query.where);
Object.keys(query).forEach(key => {
if (key !== 'where') {
cursor = cursor[key](query[key]);
}
});
return rxjs_1.Observable.create(subscriber => {
cursor.forEach(document => {
subscriber.next(document);
}, error => {
if (error) {
subscriber.error(error);
}
subscriber.complete();
});
});
}
count(query) {
query = query || {};
return rxjs_1.Observable.from(this._collection.count(query));
}
delete(query) {
query = query || {};
return rxjs_1.Observable.from(this._collection.deleteMany(query));
}
insert(doc) {
return rxjs_1.Observable.from(this._collection.insertOne(doc))
.map(response => response['ops'][0]);
}
update(query, doc) {
return rxjs_1.Observable.from(this._collection.updateOne(query, { $set: doc }))
.map(response => {
if (response['modifiedCount']) {
doc._id = query._id.toString();
return doc;
}
else {
return null;
}
});
}
}
exports.Collection = Collection;