MongoDb Присоединиться к запросу с PHP - PullRequest
1 голос
/ 11 июля 2019

У меня есть два документа, и я хочу присоединиться к обоим документам, и после того, как я хочу извлечь данные из объединенной таблицы.

Например, ниже приведен master документ

{
    "_id" : ObjectId("5d11bab64d51f58dbbd391lm"),
    "title" : "Test test",
    "test_url" : "https://www.example.com/",

}

и это деталь документ

{
    "_id" : ObjectId("5d1360536d94f726ec484426"),
    "master_id" : ObjectId("5d11bab64d51f58dbbd391lm"),
    "title" : "जेल में असलहा लहाराते हुए बदमाशों का वीडियो वायरल, गृह विभाग ने दी सफाई",
    "description" : "जिला कारागार में अपराधियों द्वारा असलहा लहराते हुए वीडियो सामने आया है।िला कारागार में अपराधियों द्वारा असलहा लहराते हुए वीडियो सामने आया है।िला कारागार में अपराधियों द्वारा असलहा लहराते हुए वीडियो सामने आया है।"

}

оба документа связаны с _id основного документа и master_id .Я хочу присоединиться к этой таблице и добавить подробный заголовок документа.

и после результата хочу добавить запрос для поиска данных из объединенного документа.Ниже приведен запрос для поиска.

$queryString = ".*".$queryString.".*";
$where = array(
    '$or' => array(
        array(
            'title' => new \MongoDB\BSON\Regex($queryString),
        ),
        array(
            'description' => new \MongoDB\BSON\Regex($queryString),
        ),
    )
);

1 Ответ

1 голос
/ 11 июля 2019

Для этого можно использовать конвейер агрегации

  1. Использовать $lookup для объединения двух коллекций,
  2. $unwind результирующий массив из $lookup stage
  3. $match для поиска по регулярному выражению

Если вам нужно выполнить поиск regex по title из master документа, вы можете добавить его в свой $orзапрос стадии $match, и если вы не хотите этого, не забудьте удалить из $ или запроса (я его добавил).

$pipeline = array(
    array(
        '$lookup' => array(
            'from' => 'masters',
            'localField' => '$master_id',
            'foreignField' => '$_id',
            'as' => 'master'
        )
    ),
    array(
        '$unwind' => Array(
            'path' => '$master',
            'preserveNullAndEmptyArrays' => true
         ) 
    ),
    array(
        '$match' => array(
            '$or' => array(
                array(
                    'title' => new \MongoDB\BSON\Regex($queryString),
                ),
                array(
                    'description' => new \MongoDB\BSON\Regex($queryString),
                ),
                array(
                    'master.title' => new \MongoDB\BSON\Regex($queryString),
                ),
            )
        )
    ),
    array(
        '$sort' => array(
            'field_name' => 1
        )
    ),
    array(
        '$limit' => 10
    )
)

$results = $details->aggregate($pipeline);

Теперь мой php неэто здорово, все же мне удалось написать запрос для вас.Пожалуйста, измените / измените код в соответствии с вашими потребностями.

Дело в том, что я дал вам идею, как этого добиться.Надеюсь, это поможет.

Редактировать

К sort и limit, использовать $ sort и $ limit этапы конвейера, я добавил это в ответ.

Не забудьте заменить field_name на фактическое поле, с которым вы хотите отсортировать результат.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...