|
@@ -0,0 +1,63 @@
|
|
|
|
+import * as mongoose from 'mongoose';
|
|
|
|
+import * as _ from 'lodash';
|
|
|
|
+const ObjectId = mongoose.Types.ObjectId;
|
|
|
|
+export function turnFilter(filter) {
|
|
|
|
+ const str = /^%\S*%$/;
|
|
|
|
+ // $是mongodb固定条件,不用处理;大多为手写特殊处理过的条件
|
|
|
|
+ let keys = Object.keys(filter).filter(f => !f.includes('$'));
|
|
|
|
+ for (const key of keys) {
|
|
|
|
+ const res = key.match(str);
|
|
|
|
+ if (res) {
|
|
|
|
+ const newKey = key.slice(1, key.length - 1);
|
|
|
|
+ if (!ObjectId.isValid(filter[key])) filter[newKey] = new RegExp(filter[key]);
|
|
|
|
+ delete filter[key];
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ // 再次过滤数据,将数组的数据都变成{$in:value},因为查询变成了聚合查询
|
|
|
|
+ keys = Object.keys(filter).filter(f => !f.includes('$'));
|
|
|
|
+ for (const key of keys) {
|
|
|
|
+ if (_.isArray(filter[key])) {
|
|
|
|
+ filter[key] = { $in: filter[key] };
|
|
|
|
+ } else if (filter[key] === 'true' || filter[key] === 'false') {
|
|
|
|
+ // 布尔类型的值检查,如果是布尔类型,则将字符串转为布尔
|
|
|
|
+ filter[key] = filter[key] === 'true';
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ return filter;
|
|
|
|
+}
|
|
|
|
+export function turnDateRangeQuery(filter) {
|
|
|
|
+ const keys = Object.keys(filter);
|
|
|
|
+ const times = [];
|
|
|
|
+ for (const k of keys) {
|
|
|
|
+ if (k.includes('@')) {
|
|
|
|
+ const karr = k.split('@');
|
|
|
|
+ if (karr.length === 2) {
|
|
|
|
+ const prefix = karr[0];
|
|
|
|
+ const type = karr[1];
|
|
|
|
+ if (type === 'start') {
|
|
|
|
+ if (filter[k] && filter[k] !== '') {
|
|
|
|
+ const obj = { key: prefix, opera: '$gte', value: filter[k] };
|
|
|
|
+ times.push(obj);
|
|
|
|
+ }
|
|
|
|
+ } else {
|
|
|
|
+ if (filter[k] && filter[k] !== '') {
|
|
|
|
+ const obj = { key: prefix, opera: '$lte', value: filter[k] };
|
|
|
|
+ times.push(obj);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ delete filter[k];
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ for (const i of times) {
|
|
|
|
+ const { key, opera, value } = i;
|
|
|
|
+ if (!filter[key]) {
|
|
|
|
+ filter[key] = {};
|
|
|
|
+ }
|
|
|
|
+ filter[key][opera] = value;
|
|
|
|
+ }
|
|
|
|
+ return filter;
|
|
|
|
+}
|
|
|
|
+export function dealFilter(filter) {
|
|
|
|
+ return turnFilter(turnDateRangeQuery(filter));
|
|
|
|
+}
|