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

Laravel使用jenssegers/laravel-mongodb获取多MongoDB集合数据的方法

在Laravel中使用jenssegers/laravel-mongodb获取多个集合数据的解决方案

你可以通过以下两种方式实现一次性获取多个集合的数据,同时兼顾分页需求:

方法一:使用MongoDB聚合的$unionWith操作(推荐)

利用MongoDB的$unionWith聚合阶段直接在数据库层面合并多个集合的数据,效率更高,之后再处理分页逻辑。

示例代码:

// 定义需要合并的集合列表
$collections = ['products_1', 'products_2', 'products_3', 'products_4'];
$perPage = 5;
$page = request()->get('page', 1);
$skip = ($page - 1) * $perPage;

// 查询分页数据
$results = DB::connection('mongodb')
    ->collection('products_1')
    ->raw(function ($collection) use ($collections, $skip, $perPage) {
        $pipeline = [
            [
                '$unionWith' => [
                    'collations' => array_map(function ($coll) {
                        return ['coll' => $coll];
                    }, array_slice($collections, 1))
                ]
            ],
            ['$skip' => $skip],
            ['$limit' => $perPage]
        ];
        return $collection->aggregate($pipeline);
    });

// 统计总数据量,用于构建分页实例
$total = DB::connection('mongodb')
    ->collection('products_1')
    ->raw(function ($collection) use ($collections) {
        $pipeline = [
            [
                '$unionWith' => [
                    'collations' => array_map(function ($coll) {
                        return ['coll' => $coll];
                    }, array_slice($collections, 1))
                ]
            ],
            ['$count' => 'total']
        ];
        $countResult = $collection->aggregate($pipeline)->toArray();
        return $countResult[0]['total'] ?? 0;
    });

// 构建Laravel标准分页对象
$paginatedResults = new \Illuminate\Pagination\LengthAwarePaginator(
    $results->toArray(),
    $total,
    $perPage,
    $page,
    ['path' => \Illuminate\Pagination\Paginator::resolveCurrentPath()]
);

方法二:循环查询合并结果后手动分页

如果集合数量不多、单集合数据量较小,可以逐个查询集合数据,合并后再手动处理分页。

示例代码:

$collections = ['products_1', 'products_2', 'products_3', 'products_4'];
$allProducts = collect();

// 遍历集合合并数据
foreach ($collections as $collection) {
    $products = DB::connection('mongodb')->collection($collection)->get();
    $allProducts = $allProducts->merge($products);
}

// 手动分页
$perPage = 5;
$paginatedResults = $allProducts->forPage(request()->get('page', 1), $perPage);

注意:方法二更适合小数据量场景,数据量大时优先用方法一,避免内存占用过高。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 08:20:42