我有 2 个表,如索赔和订单,在索赔表中我有订单 id。当我查询这个时,它也会使用选定的值获取 ordel 表的结果。但我希望当我发送搜索参数时,它仅从声明的主表中搜索值,而不将搜索值与填充表进行比较。
控制器 查询参数为 search
搜索字段: client_id:在父表中输入数字(工作) store_order_number:在订单表中输入字符串(不工作)
if (search) {
const searchRegex = new RegExp(search, "i"); // case-insensitive search
query.$or = [
{ "order_id.store_order_number": { $regex: searchRegex } },
{ "order_id.protect_order_number": { $regex: searchRegex } },
{
$expr: {
$regexMatch: {
input: { $toString: "$claim_id" },
regex: searchRegex,
},
},
},
];
}
服务功能
let claims = await schemaClaims
.find(query, projection)
.populate([
{
path: "order_id",
model: "Order",
select: "_id store_order_number protect_order_number",
options: { lean: true },
},
])
.sort(sortQuery)
.skip(parseInt(skip))
.limit(limit);
据我了解,搜索参数仅适用于主表,而不适用于已填充的表。我只是想是否可以通过任何方式使用搜索我们已填充的子表。
直接,不,您不能使用传递到数据库的过滤器来过滤填充的字段。
populate 方法是在从数据库返回初始结果后在客户端运行的,因此应用传递的过滤器为时已晚。
您可以将查找查询重写为聚合,使用 $match 过滤父表,然后使用 $lookup 阶段从子表中检索值,并使用另一个 $match 根据子表中的字段进行过滤。