Laravel mongodb поиск данных в объекте

#php #database #laravel #mongodb #nosql

Вопрос:

Я создаю приложение Laravel, которое связано с MongoDB. Теперь я столкнулся с проблемой при запросе данных из базы данных.

 table name: Employee    
[
  {
    "_id": 1,
    "name": "user 1",
    "managers": [
      {
        "id": 321,
        "user_id": 1,
        "ack_groups: [
          ["2","3", "4"],
          ["2", "5", "6"]
        ]
      },
      ......
    ] 
  },
  {
    "_id": 2,
    "name": "user 2",
    "managers": [
      {
        "id": 3213,
        "user_id": 2,
        "ack_groups: [
          ["6","7", "8"],
          ["2", "5", "6"]
        ]
      },
      ......
    ] 
  },
  {
    "_id": 3,
    "name": "user 3",
    "managers": [
      {
        "id": 321,
        "user_id": 3,
        "ack_groups: [
          ["8","9", "14"],
          ["12", "15", "16"]
        ]
      },
      ......
    ] 
  },
]
 

Я пытаюсь запросить список данных о сотрудниках из таблицы сотрудников с некоторыми условиями. Условие состоит в том, что я хочу получить список сотрудников, где ac_groups в managers равном 2.
Тогда результат должен быть:

 [
  {
    "_id": 1,
    "name": "user 1",
    "managers": [
      {
        "id": 321,
        "user_id": 1,
        "ack_groups: [
          ["2","3", "4"],
          ["2", "5", "6"]
        ]
      },
      ......
    ] 
  },
  {
    "_id": 2,
    "name": "user 2",
    "managers": [
      {
        "id": 3213,
        "user_id": 2,
        "ack_groups: [
          ["6","7", "8"],
          ["2", "5", "6"]
        ]
      },
      ......
    ] 
  },
]
 

Что я пробовал в коде: Employee::where('verify_routes.managers.ack_groups', '=', "2")->get();

Комментарии:

1. можно ли это сделать с помощью aggregate ?

2. @mohammadNaimi не могли бы вы показать мне, как это сделать с aggregate? выполнив необработанный запрос?

3. это моя агрегация в mongodb, а не в laravel mongoplayground.net/p/t5aI8Drpi6u

Ответ №1:

Форум: «Найти в массиве значение»

Doc: Конкретные операторы

Это должно сработать:

 Employee::where('verify_routes.managers.ack_groups', 'all', [2])->get();