/** * mongodb Helper * * @author caiaolin * @date 2017/5/22. */ const mongoose = require('mongoose'); class MongooseHelper { /** * mongoose连接对象 * * @var {object} */ connect = null; /** * mongoose数据模型 * * @var {object} */ model = null; /** * 查找单一数据 * * @param {object} conditions * @param {object} fields * @param {Object} option * @return {Promise} */ findOne(conditions, fields = null, option = null) { let self = this; let sort = {}; if (option !== null && Object.keys(option).length > 0) { sort = option.sort !== undefined ? option.sort : sort; } return new Promise(function (resolve, reject) { conditions = self._convertId(conditions); self.model.findOne(conditions, fields, function (error, data) { if (error) { reject(null); } else { resolve(data); } }).sort(sort); }); } /** * 查找数据 * * @param {object} conditions * @param {object} fields * @param {object} option * @return {Promise} */ find(conditions, fields = null, option = null) { let self = this; let limit = 0; let skip = 0; let sort = {_id:1}; if (option !== null && Object.keys(option).length > 0) { limit = option.pageSize !== undefined ? option.pageSize : limit; skip = option.offset !== undefined ? option.offset : skip; sort = option.sort !== undefined ? option.sort : sort; } return new Promise(function (resolve, reject) { self.model.find(conditions, fields, option, function (error, data) { if (error) { reject(error); } else { resolve(data); } }).sort(sort).skip(skip).limit(limit); }); } /** * 关联查找数据 * * @param {object} conditions * @param {object} fields * @param {Object} option * @param {String|Object} populate * @return {Promise} */ findWithPopulate(conditions, fields = null, option, populate = '') { let self = this; let limit = 0; let skip = 0; let sort = {}; if (option !== null && Object.keys(option).length > 0) { limit = option.pageSize !== undefined ? option.pageSize : limit; skip = option.offset !== undefined ? option.offset : skip; sort = option.sort !== undefined ? option.sort : sort; } conditions = self._convertId(conditions); return new Promise(function (resolve, reject) { self.model.find(conditions, fields).skip(skip).limit(limit).sort(sort) .populate(populate).exec(function(error, data) { if (error) { reject(error); } else { resolve(data); } }); }); } /** * 查找且更新(原子操作) * * @param {object} update * @param {object} condition * @param {object} options * @return {Promise} */ findAndModify(condition, update, options) { let self = this; return new Promise(function (resolve, reject) { self.model.findOneAndUpdate(condition, update, options, function(error, data) { if (error) { reject(error); } else { resolve(data); } }); }); } /** * 新增操作 * * @param {object} data * @return {Promise} */ create(data) { let self = this; return new Promise(function (resolve, reject) { self.model.create(data, function(error, data) { if (error) { reject(error); } else { resolve(data); } }); }); } /** * 统计数据数量 * * @param {Object} condition * @return {Promise} */ count(condition) { let self = this; return new Promise(function(resolve, reject) { self.model.count(condition, function(error, data) { if (error) { reject(error); } else { resolve(data); } }); }); } /** * 删除数据 * * @param {Object} condition * @return {Promise} */ delete(condition) { let self = this; return new Promise(function(resolve, reject) { self.model.remove(condition, function(error, data) { if (error) { reject(error); } else { resolve(data); } }); }); } /** * 更新数据 * * @param {Object} condition * @param {Object} updateData * @return {Promise} */ update(condition, updateData) { let self = this; return new Promise(function(resolve, reject) { condition = self._convertId(condition); self.model.update(condition, {$set: updateData}, function(error, data) { if (error) { reject(error); } else { resolve(data); } }); }); } /** * id转换为objectId * * @param {object} condition * @return {object} */ _convertId(condition) { // 对于ID的处理 if (condition === null || condition._id === undefined) { return condition; } condition._id = condition._id.toString(); let result = mongoose.Types.ObjectId(condition._id); condition._id = result; return condition; } } module.exports = MongooseHelper;