Статьи

Как использовать проекцию в MongoDB?

В mongodb проекция означает выбор только необходимых данных, а не полных данных документа. Если в документе 5 полей и вам нужно показать только 3, выберите из него только 3 поля. Есть несколько операторов проекции, которые mongodb предоставляет и помогает нам достичь этой цели.

Давайте поговорим об этих операторах подробно ниже.

$:

Сначала поговорим о $ операторе. Этот оператор ограничивает содержимое поля, включенного в результаты запроса, для включения первого соответствующего элемента.

  • Обязательно должно появиться поле в документе запроса.
  • Один позиционный оператор $ может отображаться только в проекционном документе.
  • За один раз в документе запроса может появиться только одно поле массива.

Теперь давайте посмотрим на базовый пример этого оператора.

1
db.collection.find( { : ... },{ ".$": 1 } )

В приведенном выше примере, как вы можете видеть, мы использовали find () для коллекции. Метод содержит только 1 значение для массива. Он указывает, что в одном запросе из массива можно извлечь только одно значение в зависимости от позиции.

Ограничение поля массива:

Так как в документе запроса может отображаться только одно поле массива, если массив содержит документы, чтобы указать критерии для нескольких полей этих документов, что мы можем использовать?

$ Elematch:

В MongoDB оператор проекции $ elemMatch используется для ограничения содержимого поля массива, включенного в результаты запроса, чтобы оно содержало только первый соответствующий элемент в массиве в соответствии с заданным условием.

  • Элементы массива являются документами.
  • Если несколько элементов соответствуют условию $ elemMatch, оператор возвращает первый соответствующий элемент в массиве.
  • Оператор проекции $ elemMatch аналогичен оператору позиционного $ проекции.

Чтобы описать пример об этом операторе, у нас должна быть база данных, в которой БД состоит из множества данных типа документа. На мой взгляд, для этого подходит студенческий балл. Давайте посмотрим на запрос.

1
db.grades.find( { records: { $elemMatch: { student: "stud1", grade: { $gt: 85 } } } } );

В этом примере возвращаются все документы в коллекции оценок, где любой элемент в массиве записей удовлетворяет всем условиям в выражении $ elemMatch. В этом примере возвращаются все документы в коллекции оценок, где массив записей содержит хотя бы один элемент, в котором учащийся равен Stud1, а класс — более 85
Но что произойдет, если есть два параметра, указывающие 2 разных класса одного и того же ученика? Как это:

1
db.grades.find( { records: { $elemMatch: { student: "stud1", grade: { $gt: 85 } } , : { student: "stud1", grade: { $gt: 90 } } } } );

поскольку в приведенном выше запросе соответствует только один параметр, выходные данные будут отображаться идеально. В $ elematch любой 1 параметр должен совпадать. Однако в следующем случае:

1
db.grades.find( { records: { $elemMatch: { student: "stud1", grade: { $gt: 85 } } , : { student: "stud2", grade: { $gt: 90 } } } } );

Это не будет соответствовать запросу, потому что ни один вложенный документ не соответствует указанным критериям.

Различия в проекционных операторах:

Оператор позиционной ($) проекции:

  • ограничивает содержимое поля массива, включенного в результаты запроса, так, чтобы оно содержало первый элемент, соответствующий документу запроса.
  • требует, чтобы соответствующее поле массива было включено в критерии запроса
  • может использоваться только в том случае, если в критериях запроса появляется одно поле массива
  • может использоваться только один раз в проекции

Оператор проекции $ elemMatch

  • ограничивает содержимое поля массива, включенного в результаты запроса, только первым элементом массива, соответствующим условию $ elemMatch.
  • не требует наличия соответствующего массива в критериях запроса
  • может использоваться для соответствия нескольким условиям для элементов массива, которые являются встроенными документами

$ ломтика

Оператор $ slice контролирует количество элементов массива, возвращаемого запросом. Информацию об ограничении размера массива во время обновления с помощью $ push смотрите вместо этого в модификаторе $ slice.
Давайте посмотрим на основной запрос:

1
db.collection.find( { field: value }, { array: {$slice: count } } );

Эта операция выбирает коллекцию документов, идентифицированную полем с именем field, которое содержит значение, и возвращает количество элементов, указанных значением count, из массива, хранящегося в поле массива. Если count имеет значение больше, чем количество элементов в массиве, запрос возвращает все элементы массива.
$ slice принимает аргументы в нескольких форматах, включая отрицательные значения и массивы.
Как вы видели основной код, давайте посмотрим, как мы можем получить набор комментариев из массива. Давайте посмотрим ниже:

1
db.posts.find( {}, { comments: { $slice: 5 } } )

Здесь $ slice выбирает первые пять элементов в массиве в поле комментариев.

1
db.posts.find( {}, { comments: { $slice: -5 } } )

Эта операция возвращает последние пять элементов в массиве.
Итак, у нас есть первые и последние пять комментариев. Но что произойдет, если нам понадобится определенное количество комментариев между массивом? Вы должны немного изменить вышеприведенный код. Следующим образом:

1
db.collection.find( { field: value }, { array: {$slice: [skip,limit] } } );

Итак, в приведенном выше коде мы видим пару параметров. Что говорит нам, как выбирать данные из массива. Как ты спрашиваешь?
В качестве первого параметра вы можете видеть, что мы использовали skip. Что говорит нам, сколько позиций в массиве мы должны пропустить, чтобы начать отсчет. А во втором у нас есть предел, который говорит нам, где остановится счет? Давайте изменим приведенный выше пример для лучшего понимания:

1
db.posts.find( {}, { comments: { $slice: [5,10] } } )

В приведенном выше примере вместо того, чтобы показать первые 5 комментариев, мы их пропустили. После пропуска с пятой позиции (поскольку позиционирование массива начинается с 0) начнется отсчет лимита.

$ мета-

Оператор $ meta projection возвращает для каждого соответствующего документа метаданные (например, «textScore»), связанные с запросом. Выражение $ meta может быть частью проекционного документа, а также выражением sort ().
Выражение $ meta имеет следующий синтаксис:

1
{ <projectedFieldName>: { $meta: <metaDataKeyword> } }

TextCore возвращает оценку, связанную с соответствующим запросом: $ text запрос для каждого соответствующего документа. Текстовая оценка показывает, насколько хорошо документ соответствует основанному термину или терминам. Если не используется вместе с запросом. По умолчанию порядок убывает.
В качестве основного примера мы можем увидеть следующий набор кодов:

1
2
3
4
db.collection.find(
,
{ score: { $meta: "textScore" } }
)

Выражение $ meta может быть частью выражения sort (). Мы подробно расскажем позже.

1
2
3
4
db.collection.find(
,
{ score: { $meta: "textScore" } }
).sort( { score: { $meta: "textScore" } } )

Резюме:

Поскольку в базах данных поиск информации является очень важным аспектом, то же самое можно сказать и о проекции в mongodb. Хотя в этой статье мы поцарапали поверхность проекции. Говоря, что вы можете понять, что есть много других способов, которыми мы можем использовать find () для проецирования определенного результата в mongodb.

Ссылка: Как использовать проекцию в MongoDB? от нашего партнера JCG Пияса Де в блоге Phlox Blog .