在 MongoDB 中搜索填充字段:可能吗?

问题描述 投票:0回答:1

我有 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);

据我了解,搜索参数仅适用于主表,而不适用于已填充的表。我只是想是否可以通过任何方式使用搜索我们已填充的子表。

sql mongodb search mongodb-query
1个回答
0
投票

直接,不,您不能使用传递到数据库的过滤器来过滤填充的字段。

populate 方法是在从数据库返回初始结果后在客户端运行的,因此应用传递的过滤器为时已晚。

您可以将查找查询重写为聚合,使用 $match 过滤父表,然后使用 $lookup 阶段从子表中检索值,并使用另一个 $match 根据子表中的字段进行过滤。

© www.soinside.com 2019 - 2024. All rights reserved.