<?xml version="1.0" encoding="UTF-8"?>
<ItemInfo Name="test.test" Label="测试">
    <Fields>
        <!--Name 字段名称-->
        <!--Type 数据类型, 与 MongoDB 命名相同. 由于一些名称不常见, 在解析 XML 时实现了别名的效果, 例如填写 float64 等同于 double-->
        <!--Required, 是否必填, 用于所有类型-->
        <!--Unique 是否唯一, 用于所有类型. 通过 MongoDB 实现. 自己实现可能无法保证操作的原子性-->
        <!--Minimum 最小值. 用于所有类型/ 例如数据类型为 字符串/数组 时用作长度, 数字类型时用作大小, object/map 类型是用作 key 的数量-->
        <!--Maximum 与 Minimum 相反, 用于所有类型-->
        <!--Items 数组元素类型. 用于 Array. 默认为空表示不限制元素类型, 可选值为 object 表示限定所有元素必须为 map. 当元素类型为 map 时该 map 不可包含子 map, 同时数组内的元素不可再为数组-->
        <!--Decimal 小数点后保留位数, 用于 double/float64-->

        <!--Label 中文名称. 暂时保留其用途-->
        <!--Default 默认值. 根据 Type 格式化为对应类型的数据. 用于 Insert/InsertMany-->
        <!--Enums 值的限定列表. 输入的值必须包含在其中. 用于 Insert/InsertMany/Update系列-->
        <!--Lookup 关联查询. 用于 Find/FindOne-->
        <!--Pattern 正则表达式. 输入的值必须可以被该规则匹配到. 用于 Insert/InsertMany/Update系列-->
        <!--Fields 必须存在的字段. 用于 Type=object 或 Type=array 和 Items=array 的两种情况. 用于 Insert/InsertMany/Update系列-->


        <!-- double/float64 浮点数-->
        <!--Decimal 小数点后保留位数, 用于 double/float/float64-->
        <Field Name="testFloat64" Type="float" Required="true" Unique="false" Minimum="1" Maximum="3.1415" Decimal="3">
            <Label>testFloat64</Label>
            <Default>3.1315</Default> <!-- 结果为: 3.131-->
            <Enums/>
            <Lookups>
                <Lookup From="" ForeignField="" As=""/>
            </Lookups>
        </Field>

        <!-- long/int64-->
        <Field Name="testInt64" Type="int64" Required="true" Unique="false" Minimum="666" Maximum="777">
            <Label>testInt64</Label>
            <Enums/>
            <Default>666</Default>
            <Lookup From="" ForeignField="" As=""/>
            <Sets>
                <Set Name="newName" OP="$sum" Value="testInt64,testFloat64"/>
            </Sets>
        </Field>

        <!-- array/slice 数组-->
        <!--Items 数组内元素的数据类型限制. 当值为空或 array 时不限制元素数据类型, 即 []interface{}. 值为 object 时其所有元素必须为 object/map-->
        <!-- 数据展示(items="object"):
             {
                "name":"test",
                "rows":[
                    {"name":"example","age":123,"admin":true}, // 此处 key 的 value 不可再为 map
                    {"name":"test","age":456,"admin":false},
                ],
                "other1": 111
                "other2": false
              }
         -->
        <!-- 数据展示(items=""):
             {
                "name":"test",
                "rows":[
                    "string",
                    124,
                    3.1415,
                    true,
                    {"name":"test","age":20,"admin":true}, // 此处 key 的 value 不可再为 map
                ],
                "other1": 111
                "other2": false
              }
        -->
        <Field Name="testArray" Type="array" Required="true" Unique="false" Minimum="2" Maximum="2" Items="object">
            <Label>testArray</Label>
            <Fields>    <!--必须存在的 key, Items=object 时生效-->
                <Field Name="name1"/>
                <Field Name="name2"/>
                <Field Name="name3"/>
                <Field Name="name4"/>
            </Fields>
        </Field>

        <!-- string 字符串-->
        <Field Name="testString" Type="string" Required="true" Unique="false" Minimum="5" Maximum="5">
            <Label>testString</Label>
            <Enums> <!-- Enums: 当给出选项时, 传入的值必须在 Enums 范围内-->
                <Enum>AAAAA</Enum>
                <Enum>BBBBB</Enum>
                <Enum>CCCCC</Enum>
            </Enums>
            <Default>CCCCC</Default>
            <Pattern>/[a-zA-Z0-9_-]+/</Pattern> <!-- 正则表表达式: 传入的值必须由该规则匹配到-->
            <!-- 关联查询, 下列表示从 hello 数据库表中找到字段为 testString = hello.aaa 的数据并使用 As 作为新的 key 一起包含在该条文档中
            As 数据类型为一个列表. 当 List 为 false 时限制返回 1 条数据-->
            <!-- 注意: MongoDB 仅支持关联当前数据库内的表, 不支持跨数据库关联-->
            <!-- 注意: Lookup 仅在 Find 和 FindOne 时有效-->
            <Lookup From="hello" ForeignField="aaa" As="testInt64_" List="true"/>
            <!-- 如果 Lookup 为有效配置且又配置了 Fields 时, 则仅返回 Fields 包含的字段和关联数据的 _id-->
            <Fields>
                <Field Name="name1"/>
                <Field Name="name2"/>
                <Field Name="name3"/>
                <Field Name="name4"/>
            </Fields>
        </Field>

        <!-- object/map-->
        <Field Name="testObject" Type="object" Required="false" Unique="false" Minimum="3" Maximum="3">
            <Label>testObject</Label>
            <Fields>
                <Field Name="name" Type="string"/> <!--必须存在的 key-->
                <Field Name="age" Type="int64"/> <!--必须存在的 key-->
            </Fields>
        </Field>

        <!-- objectId MongoDB ID-->
        <Field Name="testObjectID" Type="objectId" Required="true" Unique="true" Minimum="" Maximum="">
            <Label>testObjectId</Label>
            <Enums/>
            <Default>new</Default> <!-- new 表示生成一个新的 ID-->
            <Lookup From="" ForeignField="" As=""/>
        </Field>

        <!-- bool 布尔-->
        <Field Name="testBool" Type="bool" Required="true" Unique="false" Minimum="" Maximum="">
            <Label>testBool</Label>
            <Enums/>
            <Default/>
            <Lookup From="" ForeignField="" As="" List="true"/>
        </Field>

        <!-- date 日期, date 类型并非 Go 语言中的 time.Time 类型, 而是 MongoDB 自己的 DateTime 类型, 但也大致相同, 可以互相转换-->
        <!-- 需要注意的是该时间时区为 UTC+0-->
        <Field Name="testDate" Type="date" Required="true" Unique="false" Minimum="" Maximum="">
            <Label>testDate</Label>
            <Enums/>
            <Default>now</Default> <!--now 表示生成当前时间: 2022-10-25 00:00:00-->
            <Lookup From="" ForeignField="" As=""/>
        </Field>
    </Fields>
</ItemInfo>