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

如何使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 17:12:41