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
相关产品推荐
相关产品推荐

