网站搜索

TypeScript - 使用条件构建 Mongoose 查询


每个文档都有多个日期,我希望既能对其进行排序,也能进行过滤。日期过滤应根据输入的 sortBy 来应用。

这个有效

首先,我成功地添加了有条件的 .where:

        // input examples

        var fromUnixms, toUnixms; // some unix ms timestamps
        var filters = ['createdAt', 'publishAt', 'publishFrom', 'publishTo'] // available date fields
        var sortBy = 'createdAt'; // the field we want to sort on

        // let's build a condition, 
        // looping through the sortable fields and filter based on what is sorted on

        let query = model.find();
        for (var i = 0; i < filters.length; i++) {
            if (sortBy == filters[i].fieldName) {
                query.where(filters[i].fieldName).gte(fromUnixms);
                query.where(filters[i].fieldName).lte(toUnixms);

                console.log("filtering on " + filters[i].fieldName 
                    + " between " + moment(fromUnixms) 
                    + " and " + moment(toUnixms);
                }
            }
        }

        query.sort(sortBy);

目标

现在行不通的是添加一个 .or(...)

查询应返回符合任一条件的文档

  • 具有位于 fromUnixms - toUnixms 时间段内的 publishAt
  • 有一个持续时间 publishFrom - publishTo 与持续时间 fromUnixms - toUnixms 重叠

我尝试过的

                 if (sortBy == filters[i].fieldName) {
                    query.or([
                        {
                            filters[i].fieldName: {
                                $gte: fromUnixms,
                                $lte: toUnixms
                            }
                        },
                        {
                            // overlapping duration operands would go here
                        }
                    ]);

Typescript 不允许像这样在对象中使用动态键(上面的 filters[i].fieldName),会提示在点的地方期待一个 :。

提取到变量可以编译,但不会生效:Mongoose 可能会将其解释为我在寻找一个名为 "aFieldName" 的字段,而不是 "createdAt",也就是 sortBy 的值。

                // ...
                var aFieldName = filters[i].fieldName;
                if (sortBy == filters[i].fieldName) {
                    query.or([
                        {
                            aFieldName: {

显然,胡子也不能编译,但这说明了我在这里想要实现的东西:

                    query.or([
                        {
                            {{ filters[i].fieldName }} : {