如何使用 react-admin 中的参考文件在 mongoose 中启用排序和过滤

问题描述

我在 node.jsmongoose 有 2 个路由器

1.组织路由器返回组织列表

router.get('/apI/Organizations/',async (req: Request,res: Response) => {

let { sort,filter } = req.query;
sort = sort == undefined ? {} : [JSON.parse(req.query.sort as string) || {}];
filter = sort == undefined ? {} : JSON.parse(req.query.filter as string) || {};


const organizations = await Organization.find({ filter }).sort(sort);

res.setHeader('Access-Control-Expose-Headers','Content-Range');
res.setHeader('Content-Range','organizations 0-20/500');

res.send(organizations); 

});

2.项目路由器:返回每个项目与一个组织相关的项目列表。

router.get('/api/projects/',filter } = req.query;
sort = sort == undefined ? {} : [JSON.parse(req.query.sort as string) || {}];
filter = sort == undefined ? {} : JSON.parse(req.query.filter as string) || {};


const projects= await Projects.find({ filter }).sort(sort);

res.setHeader('Access-Control-Expose-Headers','projects0-20/500');

res.send(projects); 

});

我想在每个路由器中同时启用排序和过滤,但有可能两者都将发送其中之一或都不发送。

在使用 react-admin dataProvider 的 ra-data-simple-rest 客户端中,我拥有组织和项目的资源,

项目列表

 <List {...props}>
   <Datagrid  rowClick="edit" >    
       <TextField source="name" />
        <ReferenceField source="organizationId" reference="organizations">
            <TextField source="name"/>
        </ReferenceField>
        <EditButton  />
    </Datagrid>
</List>

在项目列表中,如果 sort 和 fiter 在路由器中声明,则 ReferenceField 不会显示组织字段。

我被困住了, 如何在路由器上启用排序和过滤但保留 ReferenceField 选项? 有什么想法吗?

谢谢!

解决方法

使用 ra-data-simple-rest<ReferenceField> 发出 REST 查询,如下所示:

GET http://my.api.url/posts?filter={id:[123,456,789]}

您可能需要在控制器中添加一些特殊逻辑来处理过滤器中的数组值。 MongoDB 的语法是 { $in: array }

所以我会在将 filter 传递给 Mongoose 之前对其进行转换,例如:

filter = Object.keys(filter).reduce((acc,key) => {
   const value = filter[key];
   acc[key] = Array.isArray(value) ? { '$in': value } : value;
   return acc;
},{});