בדף הזה מתוארים התחביר של Common Expression Language (CEL) והפעולות הנתמכות כשיוצרים מסננים מתקדמים למשימה של פעולות רבות על פריטי אחסון, על סמך שדות של מערך נתונים של Storage Insights.
אתם יכולים להשתמש במסננים מתקדמים כדי להעריך תנאים ולהפוך לאוטומטיות פעולות ניהול במיליוני קבצים על סמך שדות במערך הנתונים של Storage Insights. המסננים הנתמכים משתמשים בכללי CEL ישירות במטא-נתונים של האובייקטים.
כשיוצרים עבודה, אפשר לספק כללי סינון באמצעות הדגלים --bucket-filters ו---object-filters ב-Google Cloud CLI, או באמצעות השדות bucketFilters ו-objectFilters ב-API בפורמט JSON. האפשרות הזו מבטלת את הצורך לשלוח שאילתות ל-BigQuery באופן ידני, לייצא רשימות של אובייקטים ל-CSV ולהעלות מניפסטים בחזרה לקטגוריות. כשמשתמשים במסנני קבוצת נתונים לבחירת אובייקטים, פעולות רבות על פריטי אחסון מכוונות לאובייקטים פעילים ועדכניים נכון לנקודת הזמן של קובץ snapshot של קבוצת הנתונים שנבחרה. לכן, המשימה כוללת רק אובייקטים שיש להם ערך 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 |
הופכים את הכלל כדי לסנן אובייקטים שלא עומדים בתנאים. |
| חותמת הזמן | 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 |
רשומה | מכיל תובנות לגבי גישה ציבורית לאובייקט. |
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')"