Использование where in jenssegers / laravel -mongodb - PullRequest
4 голосов
/ 14 июля 2020

Я использую jenssegers / laravel -mongodb в laravel:

Структура моих данных в mongodb следующая. Предположим, есть 100 таких строк

нажмите показать изображение

Мне нужен запрос, чтобы показать мне все данные, чей статус finance.selling_type равен 1

Моя попытка написать код

finances::where('finance.selling_types.$$status', 1)->get();

или

finances::where('finance.selling_types.*.status', 1)->get();

Ответы [ 2 ]

2 голосов
/ 24 июля 2020

Используйте конвейер агрегации .

Преобразуйте объекты, встроенные в sales_types, в массив

 $convertSellingTypesToArray = [
    '$project' => [
      'finance.selling_types' => [
        '$objectToArray' => '$finance.selling_types'
      ]
    ]
  ];

Затем разверните массив в отдельные документы

$sellingTypesAsDocuments =   [
    '$unwind' => '$finance.selling_types'
];

Фильтр со статусом 1.

$selectOnlyActiveStatus = [
    '$match' => [
      'finance.selling_types.v.status' => [
        '$eq' => 1
      ]
    ]
  ];

Конвертировать sales_types обратно в объект.

$convertSellingTypesToObject = [
    '$project' => [
      'finance.selling_types' => [
        '$arrayToObject' => [
          [
            '$finance.selling_types'
          ],
        ]
      ]
    ]
  ];
finances::raw()->aggregate([
  $convertSellingTypesToArray,
  $sellingTypesAsDocuments,
  $selectOnlyActiveStatus,
  $convertSellingTypesToObject,
])

Обратите внимание, что вам потребуется поддержка разбивки на страницы по запросу

0 голосов
/ 10 августа 2020

спасибо Oluwafemi Sule, я нашел решение:

\DB::connection('mongodb')
            ->collection('finances')
            ->raw(function($collection) {
                return $collection->aggregate(
                    [
                        [
                            '$project' => [
                                'finance'=> [
                                    'selling_types'=> [
                                        '$objectToArray'=>  '$finance.selling_types'
                                    ]
                                ],
                              
                            ]
                        ],
                        [
                            '$unwind' => '$finance.selling_types'
                        ],
                        [
                            '$match'=> [
                                '$and' => [
                                    [
                                        'finance.selling_types.v.status' => [
                                            '$eq' => 1
                                        ],
                                    ],
                                ]
                            ]
                        ],

                    ]
                );
            });
...