You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Laravel中如何对Typesense对象集合的item_prices进行精准过滤?

嵌套集合中过滤子对象的正确方式

我有一个包含item的集合,每个item里包含item_prices对象集合。需要过滤出符合指定参数的item_prices条目,当前使用的过滤参数如下:

filter_by = item_prices.priceline_id:=2 && 
            item_prices.company_id:=3 

但返回结果同时包含匹配和不匹配的item_prices条目,请问正确的过滤方式是什么?

示例输入

{ 
  "document": { 
    "Brands": "SCHULTHEISS", 
    "Categories": [], 
    "id": "1398702", 
    "item_prices": [ 
      { 
        "company_id": "3", 
        "priceline_id": "0" 
      }, 
      { 
        "company_id": "3", 
        "priceline_id": "1" 
      }, 
      { 
        "company_id": "3", 
        "priceline_id": "2" 
      }, 
      { 
        "company_id": "3", 
        "priceline_id": "3" 
      } 
    ] 
  } 
}

期望返回结果

{ 
  "document": { 
    "Brands": "SCHULTHEISS", 
    "Categories": [], 
    "id": "1398702", 
    "item_prices": [ 
      { 
        "company_id": "3", 
        "priceline_id": "2" 
      } 
    ] 
  } 
}

问题原因与解决方案

当前过滤方式仅筛选出包含符合条件item_prices的父item,但不会对父item内的item_prices数组做元素级过滤,因此父对象被保留的同时,所有item_prices条目都会被返回。

正确的核心逻辑是:针对嵌套的item_prices数组本身进行元素过滤,只保留同时满足priceline_id=2和company_id=3的条目。以下是不同场景的具体实现:

1. MongoDB 查询场景

方式一:使用$elemMatch和投影

db.collection.find(
  { "document.item_prices": { $elemMatch: { priceline_id: "2", company_id: "3" } } },
  { "document.item_prices.$": 1, "document.Brands": 1, "document.Categories": 1, "document.id": 1 }
)

方式二:使用聚合管道(更灵活)

db.collection.aggregate([
  // 展开item_prices数组
  { $unwind: "$document.item_prices" },
  // 过滤符合条件的条目
  { $match: { 
      "document.item_prices.priceline_id": "2",
      "document.item_prices.company_id": "3"
    } },
  // 重新组装父对象结构
  { $group: {
      _id: "$_id",
      Brands: { $first: "$document.Brands" },
      Categories: { $first: "$document.Categories" },
      id: { $first: "$document.id" },
      item_prices: { $push: "$document.item_prices" }
    } },
  // 投影成期望的输出格式
  { $project: {
      _id: 0,
      document: {
        Brands: "$Brands",
        Categories: "$Categories",
        id: "$id",
        item_prices: "$item_prices"
      }
    } }
])

2. 应用代码过滤(以JavaScript为例)

如果已获取完整数据,可在应用层直接对数组进行过滤:

// originalData为示例输入的完整对象
const filteredData = {
  document: {
    ...originalData.document,
    item_prices: originalData.document.item_prices.filter(price => 
      price.priceline_id === "2" && price.company_id === "3"
    )
  }
};

3. SQL/ORM 场景

  • 关联查询时直接添加子表过滤条件,仅获取符合要求的item_prices记录,再重新组装成嵌套结构。
  • 或先查询父item数据,再在应用层遍历item_prices数组,剔除不符合条件的元素。

内容的提问来源于stack exchange,提问作者Rasimoghlu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 07:10:25