我已经设置了一个 before hook,以便如果存在搜索的查询参数,则会运行自定义 Mongoose 聚合查询以按客户详细信息查找订单,例如......
module.exports = function(hook, next) {
if (hook.params.query && hook.params.query.search) {
let search = hook.params.query.search;
let regEx = new RegExp(".*" + search + ".*", "i");
delete hook.params.query.search;
const OrderModel = hook.app.service("orders").Model;
OrderModel.aggregate([
{
$lookup: {
from: "customeraddress",
localField: "shipping_address",
foreignField: "_id",
as: "shipping_address"
}
},
{
$lookup: {
from: "customeraddress",
localField: "billing_address",
foreignField: "_id",
as: "billing_address"
}
},
{
$match: {
$or: [
{
"shipping_address.first_name": regEx
},
{
"shipping_address.last_name": regEx
},
{
"shipping_address.email": regEx
},
{
"billing_address.first_name": regEx
},
{
"billing_address.last_name": regEx
},
{
"billing_address.email": regEx
}
]
}
}
]).then(orders => {
hook.result = orders;
next();
});
} else {
next();
}
};
从某种意义上说,它返回订单时工作正常,但问题是我丢失了分页结果的属性,这通常是
{
"total": 2453,
"limit": 25,
"skip": 0,
"data": []
}
那么,如何在保持相同响应结构的同时执行这样的自定义查询。这是我需要自己做的事情,还是有其他方法可以做到。
意料之中的,因为您直接将猫鼬Model
用于该服务。
服务find
方法是生成这些额外信息的方法。它做一个计数给你总数。然后限制和跳过来自您的过滤器。这就是为什么如果你做$paginate false,那么你只会得到一个没有那些总数、跳过、限制的数据数组。
您可以通过执行yourservice.find({query: {...,$limit: 0}})
或使用聚合进行计数,您需要执行此类操作。
所以你需要自己做。