mongoose数据清洗算法

2022/11/3

# 场景需求

  1. 功过 schema 清洗前端来的数据结构,主要用在 createupdate 功能
  2. 前端给的就用(前端输入的数据校验在前端进行),前端没给的的数据根据schema补上:
    1. default 的用 default 的数据
    2. 没有 default 的用数据类型的数据:
  3. 注意处理嵌套数据
  4. _id/_v 是 mongodb 默认有的,就算 schema 没有也不能清洗掉

# 数据实例

#

const dataStructor = (rowData, schema) => {
    const entries = Object.entries(schema).map(([k, v]) => {
        if (rowData?.[k] !== undefined) return [k, rowData[k]];
        if (Array.isArray(v)) return [k, []];
        if (v?.default && v.type !== "Date") return [k, v.default];
        if (v?.enum) return [k, v.enum[0]];
        if (!v?.type) return [k, null];
        switch (v?.type) {
            case "Number": return [k, 0];
            case "Date": return [k, new Date()];
            case "String": return [k, ""];
            case "Boolean": return [k, true];
            case "Buffer": return [k, Buffer.from("")];
            case "Mixed": return [k, null];
            default: {
                if (Array.isArray(v.type)) return [k, []];
                if (typeof v?.type === "object") return [k, dataStructor(null, v?.type)]

                // check
                return [k, null];
            }
        }
    })
    if (rowData?._id) entries.push(["_id", rowData._id]);
    if (rowData?._v) entries.push(["_v", rowData._v]);
    return Object.fromEntries(entries);
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
上次更新: 6/13/2025