Как извлечь поддокумент в laravel mongodb - PullRequest
0 голосов
/ 01 февраля 2019

Здравствуйте, хорошие разработчики,

Я использую пакет jenssegers / laravel-mongodb для запроса моего MongoDB из Laravel.

Вот скрипка для моего запроса: https://mongoplayground.net/p/qzbNN8Siy-3

У меня есть следующий JSON

[{
    "id": "GLOBAL_EDUCATION",
    "general_name": "GLOBAL_EDUCATION",
    "display_name": "GLOBAL_EDUCATION",
    "profile_section_id": 0,
    "translated": [
      {
        "con_lang": "US-EN",
        "country_code": "US",
        "language_code": "EN",
        "text": "What is the highest level of education you have completed?",
        "hint": null
      },
      {
        "con_lang": "US-ES",
        "country_code": "US",
        "language_code": "ES",
        "text": "\u00bfCu\u00e1l es su nivel de educaci\u00f3n?",
        "hint": null
      }...
    {
     ....
    }
]

Я пытаюсь выполнить следующую команду

db.collection.find({ 'id': "GLOBAL_EDUCATION" },{_id:0, id:1, general_name:1, translated:{ $elemMatch: {con_lang: "US-EN"} }})

Ожидается такой результат

[
  {
    "general_name": "GLOBAL_EDUCATION",
    "id": "GLOBAL_EDUCATION",
    "translated": [
      {
        "con_lang": "US-EN",
        "country_code": "US",
        "hint": null,
        "language_code": "EN",
        "text": "What is the highest level of education you have completed?"
      }
    ]
  }
]

Все естьхорошо, когда запрос напрямую в MoDB, но проблема возникает, когда я пытаюсь это сделать в Laravel.Я перепробовал все возможные известные функции из пакета MongoDB.но не в состоянии это сделать.вот мой массив

$findArray = [
        [
            'id' => "GLOBAL_EDUCATION",
        ],
        [
            '_id' => 0,
            'id' => 1,
            'general_name' => 1,
            'translated' => [
                '$elemMatch' => ['con_lang' => "US-EN"]
            ],
        ]
];

$model = GlobalQuestions::raw()->find($findArray) //OR
$data = GlobalQuestions::raw(function($collection) use ($findArray){
        return $collection->find($findArray);
});

Что я здесь не так делаю, этот тип Find () здесь невозможен, и я должен сделать это путем агрегирования?

1 Ответ

0 голосов
/ 04 февраля 2019

Поскольку никто не ответил на это, я публикую решение, если у кого-то возникла такая же проблема.Выполнив еще несколько исследований и разработок, я смог сделать это, используя , где и Проект , а также Агрегационные конвейеры .

----- Использование Where () и Project () ------

$projectArray = [
    '_id' => 0,
    'id' => 1,
    'general_name' => 1,
    'translated' => [
        '$elemMatch' => ['con_lang' => "FR-FR"]
    ],
];

$data = GlobalQuestions::where('id', '=', 'GLOBAL_EDUCATION')
    ->project($projectArray)
    ->get();

--- Использование агрегации и $ unwind ---

$data = GlobalQuestions::raw(function($collection) {
    return $collection->aggregate([
        [
            '$match' => [
                'id' => "GLOBAL_EDUCATION"
            ]
        ],
        [
            '$unwind' => '$translated',
        ],
        [
            '$match' => [
                'translated.con_lang' => "US-EN"
            ]
        ],
        [
            '$project' => [
                '_id'=> 0,
                'id'=> 1,
                'general_name' => 1,
                'translated' => 1,
            ]
        ]
    ]);
})->first();
...