Оператор этапов агрегации MongoDB - $ redact
Описание
Оператор $ redact может измениться и дает новую форму каждого документа в потоке, ограничивая содержимое каждого документа на основе информации, хранящейся в самих документах.
Синтаксис:
{$ redact: <выражение>}
Выражением могут быть системные переменные $$ DESCEND, $$ PRUNE или $$ KEEP. Вот описание ниже
Системные переменные | Описание |
---|---|
$$ DESCEND | $ redact возвращает поля на текущем уровне документа, за исключением встроенных документов. Встроенные документы и встроенные документы в массивах также могут быть включены путем применения выражения $ cond к внедренным документам. |
$$ PRUNE | $ redact исключает все поля из уровня текущего документа / встроенного документа без дальнейшей проверки каких-либо исключенных полей. Исключенное поле содержит встроенные документы, которые могут иметь разные уровни доступа, также могут применяться без дальнейшей проверки. |
$$ СОХРАНИТЬ | $ redact сохраняет нетронутыми все поля на уровне текущего документа / внедренного документа, без дальнейшей проверки полей на этом уровне. Включенное поле содержит встроенные документы, которые могут иметь разные уровни доступа, также могут применяться без дальнейшей проверки. |
Тестовая дата сбора образцов
Тестовая дата коллекции содержит документы следующей формы, где в поле тегов перечислены различные значения доступа для этого уровня документа / встроенного документа; то есть значение ["MM", "KKLT"] указывает, что "MM" или "KKLT" могут получить доступ к данным.
{
"_id" : ObjectId("55432b302a8be1f2a41b9464"),
"title" : "Department Report of 456",
"tags" : [
"MM",
"KKLT"
],
"year" : 2013,
"subsections" : [
{
"subtitle" : "Overview : Section 1",
"tags" : [
"PJ",
"MM"
],
"content" : "Section 1: This is the content of section 1."
},
{
"subtitle" : "Section 2: Placement",
"tags" : [
"KKLT"
],
"content" : "Section 2: This is the content of section 2."
},
{
"subtitle" : "Section 3: Projection",
"tags" : [
"FS"
],
"content" : {
"text" : "Section 3: This is the content of section3.",
"tags" : [
"LTS"
]
}
}
]
}
Пример: $ redact
Следующие команды показывают, что пользователь имеет доступ к просмотру информации с помощью тега «KKLT» или «MM», чтобы выполнить запрос для всех документов с 2013 года для этого пользователя.
var userAccess = [ "MM", "KKLT" ];
db.testdate.aggregate(
[
{ $match: { year: 2013 } },
{ $redact: {
$cond: {
if: { $gt: [ { $size: { $setIntersection: [ "$tags", userAccess ] } }, 0 ] },
then: "$$DESCEND",
else: "$$PRUNE"
}
}
}
]
);
Выход :
{ "_id": ObjectId ("55432b302a8be1f2a41b9464"), "title": "Отчет отдела 456", "теги": [ «ММ», "KKLT" ], "2013 год, «подразделы»: [ { «субтитры»: «Обзор: Раздел 1», "теги": [ "PJ", «ММ» ], «content»: «Раздел 1: Это содержание раздела 1.» }, { «подзаголовок»: «Раздел 2: Размещение», "теги": [ "KKLT" ], «content»: «Раздел 2: Это содержание раздела 2». } ] }
Предыдущая: $ match
Далее: $ unwind
Новый контент: Composer: менеджер зависимостей для PHP , R программирования