בדף הזה מתוארים התחביר של Common Expression Language (CEL) והפעולות הנתמכות כשיוצרים מסננים מתקדמים למשימה של פעולות רבות על פריטי אחסון, על סמך שדות של מערך נתונים של Storage Insights.
אתם יכולים להשתמש במסננים מתקדמים כדי להעריך תנאים ולהפוך פעולות ניהול לאוטומטיות במיליוני קבצים, על סמך שדות במערך הנתונים של Storage Insights. המסננים הנתמכים משתמשים בכללי CEL ישירות במטא-נתונים של האובייקטים.
כשיוצרים משימה, מספקים כללי סינון באמצעות הדגלים --bucket-filters ו---object-filters ב-Google Cloud CLI, או באמצעות השדות bucketFilters ו-objectFilters ב-API בפורמט JSON. האפשרות הזו מייתרת את הצורך לשלוח שאילתות באופן ידני ל-BigQuery, לייצא רשימות אובייקטים לקובצי CSV ולהעלות מניפסטים בחזרה לקטגוריות. כשמשתמשים במסננים של מערכי נתונים כדי לבחור אובייקטים, פעולות רבות על פריטי אחסון מתמקדות באובייקטים פעילים ועדכניים נכון לתמונת המצב של מערך הנתונים שנבחר. לכן, המשימה כוללת רק אובייקטים שיש להם ערך NULL גם ב-softDeleteTime וגם ב-timeDeleted בזמן של תמונת המצב.
אופרטורים ופונקציות נתמכים
מסננים מתקדמים תומכים בתנאים שמחוברים באמצעות הצהרות AND לוגיות (&&). כדי ליצור את מחרוזות הקריטריונים, משתמשים באופרטורים הבאים:
| אופרטור | שימוש ב-CEL | תחביר מקביל ב-GoogleSQL | תיאור |
|---|---|---|---|
| StartsWith | name.startsWith("prefix") |
STARTS_WITH(name, "prefix") |
התאמת אובייקטים עם מאפיין מחרוזת שמתחיל בקידומת ספציפית. |
| EndsWith | name.endsWith(".pdf") |
ENDS_WITH(name, ".pdf") |
התאמת אובייקטים עם מאפיין מחרוזת שמסתיים בסיומת ספציפית. |
| שווה ל- | == |
= |
התאמת אובייקטים עם מאפיין ששווה לערך ספציפי. |
| לא שווה ל- | != |
!= |
החרגת אובייקטים עם מאפיין שתואם בדיוק לערך ספציפי. |
| גדול מ: | > |
> |
התאמת אובייקטים עם מאפיין של מספר שלם או חותמת זמן שחורג מסף מסוים. |
| גדול מ- או שווה ל- | >= |
>= |
התאמת אובייקטים עם מאפיין של מספר שלם או חותמת זמן ששווה לסף או חורג ממנו. |
| קטן מ: | < |
< |
התאמת אובייקטים עם מאפיין של מספר שלם או חותמת זמן מתחת לסף. |
| פחות מ- או שווה ל- | <= |
<= |
התאמת אובייקטים עם מאפיין של מספר שלם או חותמת זמן ששווה לסף או נמוך ממנו. |
| מכיל | name.contains("substring") |
STRPOS(name, "substring") != 0 |
התאמת אובייקטים עם מאפיין מחרוזת שמכיל את מחרוזת המשנה. |
| בשימוש | name in ['a', 'b'] |
name IN UNNEST(ARRAY<STRING>['a', 'b']) |
התאמת אובייקטים למאפיין שקיים ברשימה שסופקה. |
| NOT לוגי | ! |
NOT |
אפשר להפוך כלל כדי לסנן אובייקטים שלא עומדים בתנאים. |
| חותמת הזמן | timestamp("2025-01-01T00:00:00Z") |
TIMESTAMP "2025-01-01 00:00:00 UTC" |
המרת מחרוזות תאריכים בפורמט RFC 3339 לחותמת זמן. הפונקציה הזו תומכת בדיוק של מיקרו-שניות כדי להתאים לתקנים של סוג TIMESTAMP ב-BigQuery. |
| קיים | contexts.exists(c, c.key == "env") |
EXISTS(SELECT c FROM UNNEST(contexts) AS c WHERE c.key = "env" LIMIT 1) |
התאמת אובייקטים שבהם לפחות פריט אחד במאפיין מסוג רשומה חוזרת עומד בתנאי ספציפי. |
מזהים נתמכים
כשיוצרים ביטויי סינון, אפשר להפנות גם לשדות ברמת הקטגוריה וגם לשדות ברמת האובייקט. המזהים הבאים ממופים לשדות מזוהים בסכימות של טבלאות במערך הנתונים של Storage Insights:
מאפייני הקטגוריה
אתם יכולים להשתמש בשדות הבאים ברמת הקטגוריה כדי לסנן את הקטגוריות שכלולות במשימות של פעולות רבות על פריטי אחסון.
| שדה | סוג | תיאור |
|---|---|---|
name |
מחרוזת | שם הקטגוריה. |
autoclass |
רשומה | מכיל מטא-נתונים של enabled ו-toggleTime. |
autoclass.enabled |
בוליאני | מציין אם התכונה "סיווג אוטומטי" מופעלת בקטגוריה. |
autoclass.toggleTime |
TIMESTAMP | המועד האחרון שבו הופעל או הושבת הסיווג האוטומטי. |
labels |
רשומה חוזרת | מכיל מפות מפתח/ערך רגילות. |
location |
מחרוזת | מזהה המיקום של הקטגוריה. |
softDeletePolicy |
רשומה | מכיל את retentionDurationSeconds ו-effectiveTime. |
softDeletePolicy.retentionDurationSeconds |
מספר שלם | תקופת השמירה של המחיקה הרכה, בשניות. |
softDeletePolicy.effectiveTime |
TIMESTAMP | המועד שבו המדיניות בנושא מחיקה רכה נכנסה לתוקף. |
מאפייני האובייקט
אפשר להשתמש במאפיינים הבאים כדי לסנן משימות של פעולות רבות על פריטי אחסון לפי שדות ברמת האובייקט:
| שדה | סוג | תיאור |
|---|---|---|
name |
מחרוזת | שם האובייקט. |
contexts |
רשומה חוזרת | הקשרים שמצורפים לאובייקט. |
contexts.key |
מחרוזת | מפתח ההקשר בהתאמה אישית. |
contexts.value |
מחרוזת | הערך של מפתח ההקשר המותאם אישית. |
contexts.type |
מחרוזת | סוג ההקשר המותאם אישית. |
contexts.createTime |
TIMESTAMP | השעה שבה נוצר מפתח ההקשר בהתאמה אישית. |
contexts.updateTime |
TIMESTAMP | המועד שבו מפתח ההקשר בהתאמה אישית עודכן. |
contentType |
מחרוזת | סיווג תוכן לפי סוג MIME. |
customTime |
TIMESTAMP | חותמת זמן שהמשתמש מגדיר. |
generation |
מספר שלם | מזהה הגנרציה של האובייקט. |
metadata |
רשומה חוזרת | מטא-נתונים בהתאמה אישית. |
metadata.key |
מחרוזת | המפתח של המטא-נתונים בהתאמה אישית. |
metadata.value |
מחרוזת | הערך של המטא-נתונים בהתאמה אישית. |
metageneration |
מספר שלם | מזהה של דור המטא-נתונים. |
retentionExpirationTime |
TIMESTAMP | הזמן שבו פג התוקף של שמירת האובייקט. |
securityInsights |
רשומה | מכיל Access Insights לגבי הגישה הציבורית לאובייקט. |
securityInsights.publicAccessInsight |
רשומה | מציין את סטטוס הנגישות הציבורית של האובייקט. |
securityInsights.publicAccessInsight.readPublicAccess |
מחרוזת | סטטוס הקריאוּת הציבורית של האובייקט. הערכים הנתמכים הם PUBLIC, NOT_PUBLIC, UNSUPPORTED ו-ERROR. |
securityInsights.publicAccessInsight.readPublicAccessSource |
מחרוזת | אם הערך של readPublicAccess הוא PUBLIC, הפונקציה מחזירה את המקור של הרשאת הקריאה הציבורית. הערכים הנתמכים הם Object, Bucket ו-ERROR. |
securityInsights.publicAccessInsight.writePublicAccess |
מחרוזת | סטטוס יכולת הכתיבה הציבורית של האובייקט. הערכים הנתמכים הם PUBLIC, NOT_PUBLIC, UNSUPPORTED ו-ERROR. |
size |
מספר שלם | גודל האובייקט בבייטים. |
storageClass |
מחרוזת | סוג האחסון (storage class) שהוקצה. |
temporaryHold |
בוליאני | סטטוס חסימה פעיל שמונע את השחרור. |
timeCreated |
TIMESTAMP | שעון הרישום של היצירה הראשונית. |
timeStorageClassUpdated |
TIMESTAMP | המועד שבו סוג האחסון עודכן לאחרונה. |
updated |
TIMESTAMP | המועד שבו האובייקט עודכן לאחרונה. |
כללי הפורמט של הביטויים
כדי לעזור לכם להריץ את המשימות בקנה מידה גדול, מנוע השאילתות מחיל את כללי העיצוב הבאים:
- תנאי סינון: אפשר לצרף תנאי סינון רק באמצעות האופרטור הלוגי AND (
&&). מנוע השאילתות לא תומך באופרטור הלוגי OR (||). - מיקום הארגומנט: צריך למקם את שדה המטא-נתונים של היעד בצד שמאל של הפונקציות. לדוגמה, השתמשו ב-
name.startsWith("live-")במקום ב-"live-".startsWith(name). - שיטות מערך: אתם יכולים להפעיל את פקודת המאקרו
existsישירות בשדות חוזרים, כמוcontexts.exists(...)אוmetadata.exists(...). - מגבלת קטגוריות: משימה אחת של פעולות רבות על פריטי אחסון יכולה לפעול על עד 1,000 קטגוריות. אם ביטויי הסינון תואמים באופן דינמי ליותר מ-1,000 קטגוריות במערך הנתונים, יצירת המשימה תיכשל. כדי לצמצם את היקף השאילתה ולעמוד במגבלה הזו, השתמשו בשדות ספציפיים ברמת הקטגוריה (לדוגמה, סינון לפי מיקום כמו
location == "us-central1"או התאמה לפי שם כמוname.startsWith("prod-")). - מגבלת תווים: מסנני קטגוריות ומסנני אובייקטים מוגבלים ל-150 תווים לכל היותר.
דוגמאות
בדוגמאות הבאות מוצגים מסננים משולבים נפוצים שאפשר להשתמש בהם כדי לטרגט משאבים ברמת הפרויקט. מציינים את קטעי הקוד של המסננים ישירות כדגלים בפקודה gcloud storage batch-operations jobs create:
טירגוט קטגוריות ספציפיות: החלת פעולות על אובייקטים בקטגוריות ספציפיות:
--bucket-filters="name in ['bucket-1', 'bucket-2']"
בדיקת סוג האחסון ומיקום הקטגוריה: החלת פעולות על אובייקטים בסוג האחסון Standard storage במיקומים של
US:--bucket-filters="location.startsWith('us')"
--object-filters="storageClass == 'STANDARD'"סינון לפי משך השמירה של מחיקה זמנית: החלת פעולות על אובייקטים בקטגוריות שבהן המחיקה הזמנית מופעלת למשך 7 ימים לפחות:
--bucket-filters="softDeletePolicy.retentionDurationSeconds >= 604800"
סינון לפי גודל וסיומות של אובייקטים: חיפוש אובייקטים מסוג PDF שגדולים מ-5KiB:
--object-filters="size >= 5120 && name.endsWith('.pdf')"בדיקת מפתחות הקשר בהתאמה אישית: החלת פעולות על אובייקטים שיש להם מפתח הקשר בהתאמה אישית
env:--object-filters="contexts.exists(context, context.key == 'env')"
התאמה של צמדים מותאמים אישית של מפתח/ערך בהקשר: החלת פעולות על אובייקטים שיש להם מפתח הקשר מותאם אישית
envעם הערךprod:--object-filters="contexts.exists(context, context.key == 'env' && context.value == 'prod')"
התאמה של ערכי הקשר מותאמים אישית לפי קידומת וסיומת: החלת פעולות על אובייקטים עם ערך הקשר מותאם אישית שמתחיל בקידומת
prodומסתיים בסיומת.txt:--object-filters="contexts.exists(context, context.value.startsWith('prod') && context.value.endsWith('.txt'))"זיהוי מפתחות הקשר חסרים: החלת פעולות על אובייקטים שאין להם מפתח הקשר בהתאמה אישית
env:--object-filters="!contexts.exists(context, context.key == 'env')"