מתכונים — משימות נפוצות דרך MCP
מתכון 0 · פתיחת הסשן
Section titled “מתכון 0 · פתיחת הסשן”כל מתכון כאן מתחיל בשני הצעדים האלה.
1. Usage-Guide ← בלי פרמטרים. פעם אחת בסשן.2. Get-Schema { className: "…" } ← לפני כל נגיעה בטבלה שלא עבדתם עליה בסשן הזה.Usage-Guide הוא הכלי שהשרת מורה להתחיל ממנו. הוא מחזיר אובייקט עם שני מפתחות, About Us ו‑How to use, ובשני: מפת טבלאות המערכת (Accounts, _User, _Timeline), כללי מודל הדפים (apps/mybusiness/…, masterPage, rDivider/sDivider), שני מבני התנאים (field/equesition/value ו‑F/C/T/V/P), פעולות כללי הטופס, תחביר ה‑placeholders {{{Name}}} כולל format(date,he-IL,Asia/Jerusalem), והמשאב get-file.
{ "className": "Accounts" }לרשימת שמות הטבלאות בלבד — { "tablesNameOnly": true } בלי className.
מתכון 1 · כמה לידים נכנסו החודש
Section titled “מתכון 1 · כמה לידים נכנסו החודש”ליד הוא שורה ב‑Accounts עם IsAccount: false; לקוח הוא אותה טבלה עם true. טבלה אחת עם דגל.
הדרך הנכונה
Section titled “הדרך הנכונה”// Count-Data{ "table": "Accounts", "where": { "IsAccount": false, "createdAt": { "$gte": { "__type": "Date", "iso": "2026-08-01T00:00:00.000Z" } } } }תשובה אחת — {"count":361} — בלי תלות ב‑limit.
הדרך שנראית נכונה ואינה
Section titled “הדרך שנראית נכונה ואינה”// Get-Data — ואז לספור את השורות שחזרו ✗{ "table": "Accounts", "where": { "IsAccount": false } }פילוח לפי סטטוס
Section titled “פילוח לפי סטטוס”// Aggregate-Data{ "table": "Accounts", "where": { "IsAccount": false, "createdAt": { "$gte": { "__type": "Date", "iso": "2026-08-01T00:00:00.000Z" } } }, "group": { "count": { "sum": 1 } }, "groupby": "LeadStatusId.LeadStatuses.Name", "order": "-count" }{"count":{"sum":1}} הוא איך כותבים “ספירה”: אין פונקציית count נפרדת. ה‑groupby עובר דרך ה‑Pointer אל שם הסטטוס ולא אל המזהה. התשובה: {"results":[{"count":353},{"_id":"ליד חדש","count":8}]}. השורה בלי _id היא הרשומות שבהן ה‑Pointer ריק; היא תופיע בכל קיבוץ לפי Pointer, ותנו לה שם בדוח.
לשורות עצמן — Get-Data עם limit מפורש, keys ו‑order:
{ "table": "Accounts", "where": { "IsAccount": false, "createdAt": { "$gte": { "__type": "Date", "iso": "2026-08-01T00:00:00.000Z" } } }, "keys": ["Name", "PhoneNumber", "Email", "LeadStatusId", "createdAt"], "order": "-createdAt", "limit": 500 }מתכון 2 · הכנסות לפי בעלים
Section titled “מתכון 2 · הכנסות לפי בעלים”// 1. לוודא שמות שדות{ "className": "Sales" }
// 2. Aggregate-Data{ "table": "Sales", "where": { "SaleStatusId": { "__type": "Pointer", "className": "SaleStatuses", "objectId": "zrP1MSVBoq" }, "ClosingDate": { "$gte": { "__type": "Date", "iso": "2026-01-01T00:00:00.000Z" } } }, "group": { "total": { "sum": "Total" } }, "groupby": "OwnerId._User.name", "order": "-total", "limit": 10 }עשרת אנשי המכירות המובילים עם השמות שלהם, בקריאה אחת: {"results":[{"_id":"דנה לוי","total":14850}, …]}.
מבנה מסלול ה‑Pointer
Section titled “מבנה מסלול ה‑Pointer”OwnerId . _User . name ↑ ↑ ↑ שדה מחלקת השדה בטבלה היעד שאותו המקור מציגיםשם המחלקה באמצע. עוד: SaleStatusId.SaleStatuses.Name, AccountId.Accounts.Name. שדות של _User הם באותיות קטנות (name, email), בניגוד למוסכמה בשאר הטבלאות.
קיבוץ לפי חודש
Section titled “קיבוץ לפי חודש”{ "table": "Sales", "where": { "SaleStatusId": { "__type": "Pointer", "className": "SaleStatuses", "objectId": "zrP1MSVBoq" } }, "group": { "total": { "sum": "Total" } }, "groupby": { "month": { "mm": "ClosingDate" } }, "timeZone": "Asia/Jerusalem" }התשובה: {"results":[{"_id":{"month":1},"total":1500}, …, {"_id":{"month":""},"total":11106}]}. השורה עם month: "" היא המכירות בלי ClosingDate; היא תמיד שם — תנו לה שם או סננו אותה ב‑where.
חלקי תאריך אפשריים: hour, dow, q, q/yy, mm, mm/yy, yy.
העבירו timeZone. בלעדיו החישוב רץ באזור הזמן של השרת, ומכירה שנסגרה ב‑1 בחודש בשעה 01:00 בישראל נופלת לחודש הקודם.
כמה מדדים בקריאה אחת, בניגוד לסכימה. תיאור group אומר “Only one property is allowed”, אבל "group": { "total": { "sum": "Total" }, "cnt": { "sum": 1 } } מחזיר את שני המדדים בכל שורה. ודאו שכל התוויות חוזרות אם אתם מסתמכים על זה.
מתכון 3 · יבוא מרוכז בלי סופת טריגרים
Section titled “מתכון 3 · יבוא מרוכז בלי סופת טריגרים”הרצף המלא
Section titled “הרצף המלא”// 1. מה בכלל ירוץ כאן?{ "tableName": "Accounts" } // Get-Triggers
// 2. הסכימה, כדי לדעת מה מותר לשלוח{ "className": "Accounts" } // Get-Schema
// 3. פתרון ערכי lookup לפני, לא תוך כדי{ "table": "LeadStatuses", "where": { "Name": "ליד חדש" }, "limit": 1 }{ "table": "LeadSource", "where": { "Name": "אתר" }, "limit": 1 }
// 4. הטעינה — באצוות{ "table": "Accounts", "skipTriggers": true, "skipTimeline": false, "data": [ { "Name": "לקוח א'", "PhoneNumber": "0501234567", "IsAccount": false, "LeadStatusId": { "__type": "Pointer", "className": "LeadStatuses", "objectId": "e9TwcETDGq" } }, { "Name": "לקוח ב'", "PhoneNumber": "0507654321", "IsAccount": false, "LeadStatusId": { "__type": "Pointer", "className": "LeadStatuses", "objectId": "e9TwcETDGq" } } ] }
// 5. אימות{ "table": "Accounts", "where": { "IsAccount": false, "…": "…" } } // Count-Dataתשובת Create-Many היא מערך באורך הקלט, פריט לכל רשומה: [{"success":{"objectId":"S0bkiLAr0y","createdAt":"…"}},{"success":{…}}]. שמות טבלאות ה‑lookup כאן (LeadStatuses, LeadSource) ומזהי הסטטוסים הם של סביבת בדיקה; קחו את שלכם מ‑Get-Schema ומשליפה.
בטריגרים שמגיעים עם מערכת vanilla על Accounts (“Lead Conversion Date”, “Account Lead Status”, שניהם על IsAccount: true): עם skipTriggers: true הרשומות נוצרות בלי LeadConversionDate ועם הסטטוס שנשלח; בלעדיו הטריגר רץ, ממלא LeadConversionDate ומחליף את LeadStatusId ל“לקוח”.
שלוש החלטות שנסגרות מראש
Section titled “שלוש החלטות שנסגרות מראש”| ההחלטה | האפשרויות |
|---|---|
| טריגרים | skipTriggers: true — ואז אתם ממלאים את מה שהטריגר היה ממלא (חותמות זמן, רשומות בת) · או לתת להם לרוץ במודע, אחרי שניטרלתם את פעולות ההתראה לזמן היבוא |
| ציר הזמן | skipTimeline: true מהיר יותר, ומוחק את היכולת להוכיח מה נטען ומתי. ביבוא ראשוני לרוב משאירים אותו דלוק — יומנים וראיות |
| גודל אצווה | לא נמצאה תקרה קשיחה (120 רשומות בקריאה אחת עברו כולן success; גם ב‑REST batch התקרה אינה נאכפת). עבדו באצוות של עשרות עד מאות, בלולאה סדרתית — גוף בקשה גדול מדי נופל על HTTP 413, לא על שגיאת כלי |
סדר התשובה = סדר הקלט
Section titled “סדר התשובה = סדר הקלט”Create-Many מחזיר את המזהים בסדר שבו שלחתם את הרשומות (data[0] ⇒ [0].success.objectId). זה מה שמאפשר טעינה דו‑שלבית לפי מיקום:
data[0] → objectId[0] → הליד של שורה 0 בקובץdata[1] → objectId[1] → הליד של שורה 1…ואז: Create-Many על Sales, עם Pointer ל-objectId המתאים לכל שורהלפני שמתחילים
Section titled “לפני שמתחילים”- נקו כפילויות במקור. אין
Delete-Data; שורה כפולה שנטענה נשארת עד שמישהו ימחק אותה בממשק או ב‑REST עם Master Key. - נרמלו טלפונים לפורמט אחד.
- בדקו על 2 שורות קודם: אצווה קטנה,
Get-Dataעל מה שנוצר, ורק אז השאר.
מתכון 4 · מצא‑או‑צור, ואז רשומה מקושרת
Section titled “מתכון 4 · מצא‑או‑צור, ואז רשומה מקושרת”Get-Schema → חיפוש → קיים? השתמש : צור → צור רשומה מקושרת עם Pointer → אמתשלב 1 · חיפוש
Section titled “שלב 1 · חיפוש”// Get-Data{ "table": "Accounts", "where": { "PhoneNumber": "0501234567" }, "keys": ["Name", "PhoneNumber", "Email", "IsAccount"], "limit": 5 }טלפון ישראלי מופיע בפורמטים שונים באותה מערכת (0501234567, +972501234567, 050-123-4567), והשוואה מדויקת על ערך אחד תפספס: חפשו לפי אימייל, או הריצו כמה שאילתות על הווריאציות. הדפוס שהמוצר מיישם בקליטת טפסים: זיהוי כפילויות.
שלב 2 · יצירה אם אין
Section titled “שלב 2 · יצירה אם אין”// Create-Data{ "table": "Accounts", "data": { "Name": "דנה כהן", "PhoneNumber": "0501234567", "Email": "dana@example.co.il", "IsAccount": false } }התשובה — { "objectId": "ajBZIKKbyU", "createdAt": "…" } — מוחזקת לשלב הבא.
שלב 3 · הרשומה המקושרת
Section titled “שלב 3 · הרשומה המקושרת”// Create-Data{ "table": "Sales", "data": { "Name": "הצעה — אתר תדמית", "AccountId": { "__type": "Pointer", "className": "Accounts", "objectId": "xK9mP2qRsT" }, "OwnerId": { "__type": "Pointer", "className": "_User", "objectId": "2b0QVKoigE" }, "SaleStatusId": { "__type": "Pointer", "className": "SaleStatuses", "objectId": "zrP1MSVBoq" }, "Total": 18500, "ClosingDate": { "__type": "Date", "iso": "2026-09-30T00:00:00.000Z" } } }מזהי הסטטוס (SaleStatusId, LeadStatusId וכו’) אינם קבועים בין מערכות. שלפו אותם פעם אחת בתחילת הסשן והחזיקו מפה בזיכרון:
{ "table": "SaleStatuses", "keys": ["Name"], "limit": 100 }// ⇒ [{"objectId":"E9cYlAlooc","Name":"חדש"}, {"objectId":"zrP1MSVBoq","Name":"הושלמה"}, …]שלב 4 · אימות
Section titled “שלב 4 · אימות”// Get-Data על מה שנוצר, עם ה-Pointer{ "table": "Sales", "where": { "AccountId": { "__type": "Pointer", "className": "Accounts", "objectId": "xK9mP2qRsT" } }, "keys": ["Name", "Total", "SaleStatusId", "createdAt"], "order": "-createdAt", "limit": 5 }אל תסתפקו ב“הקריאה הצליחה”. שליפה חוזרת היא הדרך היחידה לגלות שדה שנשמר בעמודה שגויה, Pointer לרשומה הלא נכונה, או טריגר ששינה את מה שכתבתם — אף אחד מאלה אינו מייצר שגיאה.
- כלי נתונים — הפרמטרים המלאים
- כלי טריגרים ואוטומציות — מה ירוץ כשתכתבו
- סוכן במצב קריאה בלבד — לתכנן עכשיו, לבצע בהמשך
- אינדקס הכלים המלא
- מודל הנתונים ומוסכמות · סוגי נתונים · מפת הטבלאות