如何使用Moloquent根据子文档_id检索指定子文档
通过子文档ID使用Moloquent获取指定MongoDB子文档
假设你的父模型是Pack(对应MongoDB中的集合),要从父文档的slots数组里精准取出指定_id的子文档,这里有两种实用的方法:
原始父文档参考
{ "_id": ObjectId('5f8970f19e6afb628a2edd07'), "name": "pack 1", "price": 100, "min_price": 100, "updated_at": ISODate('2020-10-16T10:07:45.570Z'), "created_at": ISODate('2020-10-16T10:07:45.530Z'), "available_quantity": -1, "quantity": -1, "slots": [ { "duration": "365", "price": 100, "_id": "5f8970f19e6afb628a2edd07_5f8970f18b3aa", "created_at": ISODate('2020-10-16T10:07:45.529Z'), "updated_at": ISODate('2020-10-16T10:07:45.529Z'), "available_quantity": -1, "quantity": -1 }, { "duration": "255", "_id": "5f8970f19e6afb628a2edd07_5f8970f18b3c7", "created_at": ISODate('2020-10-16T10:07:45.529Z'), "updated_at": ISODate('2020-10-16T10:07:45.529Z'), "price": 100, "available_quantity": -1, "quantity": -1 } ] }
方法一:使用MongoDB的$elemMatch查询操作符
这种方法直接在数据库层面筛选出目标子文档,减少不必要的数据传输:
// 定义父文档ID和目标子文档ID $parentDocId = '5f8970f19e6afb628a2edd07'; $targetSubDocId = '5f8970f19e6afb628a2edd07_5f8970f18b3aa'; // 执行查询,只返回匹配的子文档 $pack = Pack::where('_id', $parentDocId) ->select(['slots' => ['$elemMatch' => ['_id' => $targetSubDocId]]]) ->first(); // 提取目标子文档(此时slots是仅包含一个元素的数组) $targetSubDoc = $pack?->slots[0];
方法二:利用Laravel集合的筛选方法
如果已经获取了父文档实例,直接用集合方法筛选会更直观灵活:
// 先获取父模型实例 $pack = Pack::find('5f8970f19e6afb628a2edd07'); // 使用firstWhere精准匹配子文档的_id $targetSubDoc = $pack?->slots->firstWhere('_id', '5f8970f19e6afb628a2edd07_5f8970f18b3aa');
两种方法都能帮你拿到目标子文档,方法一更适合仅需子文档数据的场景,方法二则适合已经持有父模型实例的情况。
内容的提问来源于stack exchange,提问作者Luigi De Francisci
相关产品推荐
相关产品推荐

