MongoDB+Mongoose骨料,含Asnyc

MongoDB+Mongoose骨料,含Asnyc,mongodb,express,asynchronous,promise,mern,Mongodb,Express,Asynchronous,Promise,Mern,我的express文件中有以下路径,它接受从中间件函数传入的参数,并查询我的后端MongoDB数据库。但由于某些原因,它只返回一个空数组 我想将Mongoose模型转换为async/await,以符合代码的其余部分。这里是在线的 由于某些原因,路由每次只返回一个空数组。我已经对变量进行了双重和三重检查,它们不是问题所在 如何在异步等待路由中使用Mongoose.aggregate函数?您能否列出示例数据,并在其上执行查询?以及输入?//按时间范围过滤掉…-因此,这里的输入看起来是字符串,而不是日

我的express文件中有以下路径,它接受从中间件函数传入的参数,并查询我的后端MongoDB数据库。但由于某些原因,它只返回一个空数组

我想将Mongoose模型转换为async/await,以符合代码的其余部分。这里是在线的

由于某些原因,路由每次只返回一个空数组。我已经对变量进行了双重和三重检查,它们不是问题所在


如何在异步等待路由中使用Mongoose.aggregate函数?

您能否列出示例数据,并在其上执行查询?以及输入?//按时间范围过滤掉…-因此,这里的输入看起来是字符串,而不是日期对象。aggregate不会像find或其他使用mongoose的方法那样基于模型自动广播类型。因为聚合意味着改变文档的形状,使其与模型的形状不同。因此,不能将模型用于类型转换。使用新的日期包装字符串参数,以便手动转换类型。此外,由于没有在初始$match阶段包含所有条件,因此降低了很多效率。事实上,这是数据库能够正确选择要使用的索引并执行最有效查询的唯一地方。另请注意,$set对于聚合管道阶段名称无效。实际上,您似乎希望在此处使用$addFields。嘿,尼尔,感谢您在$match上的指针,将进行更改。我的“日期”实际上被存储为数字,所以这不是问题所在。PS-在4.2中实际上有一个$set运算符,这就是我使用的:.req.search-这始终是字符串输入。你仍然需要在这里投球。parseInt或类似工具适用于数字。仅供参考,mongoData是一个数组。所以mongoData.data和| |是无效的。聚合始终只返回空数组或实际结果作为数组。这不是异步问题。但是你的输入和结束逻辑有问题。是的,$set和$addFields的别名是一样的。我个人不喜欢它,因为人们可能认为这意味着更新。但事实并非如此。而前者在早期版本中没有突破
module.exports = {
    search: asyncWrapper(async(req, res, next) => { // Retrieve and return documents from the database.
        const { 
            filterTarget, 
            filter, 
            source, 
            minDate,
            maxDate, 
            skip, 
            limit,
            sortBy,
            sortOrder
        } = req.search;

        try {
            const mongoData = await Model.aggregate([
                {
                    $match: { 
                        date: {
                            $gt: minDate, // Filter out by time frame...
                            $lt: maxDate
                        }
                    }
                },
                {
                    $match: { 
                        [filterTarget]: filter // Match search query....
                    }
                },
                {
                    $set: {
                        [filterTarget]: { $toLower: `$${filterTarget}` } // Necessary to ensure that sort works properly...
                    }
                },
                {
                    $sort: {
                        [sortBy]: sortOrder // Sort by date...
                    }
                },
                {
                    $group: { 
                        _id: null,
                        data: { $push: "$$ROOT" }, // Push each document into the data array.
                        count: { $sum: 1 }
                    }
                },
                {
                    $project: {
                        _id: 0,
                        count: 1,
                        data: { 
                            $slice: ["$data", skip, limit]
                        },

                    }
                }
            ])

            return res.status(200).json({ data: mongoData.data || [], count: mongoData.count || 0 });

        } catch (err) {
            next(err);
        }
    })
};