@Quieteroks
php программист

Можно ли получить запись с одним вложенным элементом?

Здравствуйте.
Копаюсь в документации и никак не могу найти ответ на вроде как простой вопрос. Можно ли одним запросом (агрегацией) вытащить запись из коллекции с единственным вложенным элементом из списка?

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

Пример документа:
{ 
    "status" : NumberLong(1), 
    "data" : [
        {
            "subject" : {
                "docNumber" : "0000 000000", 
                "fname" : "Васильев", 
                "mname" : "Васильевич", 
                "lname" : "Васильев"
            }, 
            "applications" : [
                {
                    "number" : "ДОК-00022325", 
                    "info" : "..."
                }
            ], 
            "documents" : [
                {
                    "number" : "ДОК-00022325", 
                    "info" : "..."
                }
            ]
        }
    ]
}


Соответственно мне нужно получить только список всех documents которые соответствуют number ДОК-00022325 и получить из низ информацию из поля info (может быть несколько записей в коллекции, удовлетворяющих условия поиска), в любом формате. Работать с малым объемом данных проще, чем перебирать тысячи строк.

Возможно это реализовать на стороне MongoDB?

UPD:
Докопался до такого варианта. Но если есть еще предложения, буду раз прочитать.
aggregate(
  [
    {
      $match: {
      	"data.documents.number": "ДОК-00022325"
      }
    },
    {
      $unwind: "$data"
    },
    {
      $match: {
      	"data.documents.number": "ДОК-00022325"
      } 
    }
  ]
);
  • Вопрос задан
  • 191 просмотр
Решения вопроса 1
@lega
Можете изменить схему, чтобы number был ключем, например:
documents: {
  "ДОК-00022325": {info:''},
  "ДОК-00022326": {},
}

и простой запрос:
.findOne({_id: xxx}, {'documents.ДОК-00022325.info': 1})

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

Ещё для массивов можно использовать https://docs.mongodb.com/manual/reference/operator...

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

Войдите, чтобы написать ответ

Похожие вопросы