כלי נתונים
שלושה כלי קריאה (Get-Data, Count-Data, Aggregate-Data) ושלושה כלי כתיבה (Create-Data, Create-Many, Update-Data).
Get-Data
Section titled “Get-Data”שולף רשומות מטבלה.
| הפרמטר | טיפוס | חובה | המשמעות |
|---|---|---|---|
table |
String | ✔ | שם הטבלה (class name), למשל Accounts |
where |
Object | תנאי סינון. מפתחות מרובים מתחברים ב‑AND | |
keys |
Array<String> | שדות להחזיר. objectId, createdAt ו‑updatedAt חוזרים תמיד. ברירת מחדל: הכול |
|
order |
String | שדה למיון; - ליורד, למשל -createdAt |
|
limit |
Number | ברירת מחדל 5, מינימום 1, מקסימום 2000. 0 / 2001 נדחים בוולידציה (Too small / Too big) |
|
skip |
Number | עימוד. ברירת מחדל 0 |
|
objectId |
String | רשומה בודדת. בדיוק 10 תווים (9 נדחים). מבטל את שאר הפרמטרים |
{ "table": "Accounts", "where": { "IsAccount": false, "createdAt": { "$gt": { "__type": "Date", "iso": "2026-08-01" } } }, "keys": ["Name", "PhoneNumber", "LeadStatusId"], "order": "-createdAt", "limit": 200 }התשובה נקטמת ב‑5 בלי שגיאה. העבירו limit מפורש תמיד; לספירה Count-Data.
ב‑REST אחרת: ברירת מחדל 100, בלי תקרה נאכפת (טבלה בת 2,101 שורות, limit=5000 החזיר את כל 2,101). ראו מגבלות ומכסות.
תחביר Parse. אופרטורים: $gt, $lt, $gte, $lte, $ne, $in, $nin, $exists, $regex.
{ "IsAccount": true, "City": { "$in": ["תל אביב", "רמת גן"] }, "Total": { "$gte": 10000 }, "ClosedAt": { "$exists": false }, "createdAt": { "$gte": { "__type": "Date", "iso": "2026-01-01T00:00:00.000Z" } }, "OwnerId": { "__type": "Pointer", "className": "_User", "objectId": "2b0QVKoigE" }}- Pointer בסינון: אובייקט מלא בלבד —
{"__type":"Pointer","className":"…","objectId":"…"}. מחרוזת objectId חשופה לא תואמת דבר, בשקט (count: 0במקום התוצאה). בטפסי web2* ההפך, שם Pointer הוא מחרוזת. ראו סוגי נתונים. - תאריך: אובייקט עטוף
{"__type":"Date","iso":"…"}. מחרוזת חשופה מושווית כטקסט ומחזירה0תוצאות, בלי שגיאה.
Pointer חוזר גם בתשובה כאובייקט מלא — {"__type":"Pointer","className":"SaleStatuses","objectId":"E9cYlAlooc"} — לא כמזהה ולא כרשומה מורחבת: אין include. לשמות במקום מזהים: Aggregate-Data עם מסלול Pointer, או שליפה נוספת.
objectId
Section titled “objectId”הפרמטר קיים בסכימה החיה. אם הוא חסר ברשימת פרמטרים שראיתם במקום אחר — הסכימה שהשרת מפרסם גוברת.
{ "table": "Accounts", "objectId": "xK9mP2qRsT" }Count-Data
Section titled “Count-Data”סופר רשומות שעונות לתנאי, בלי להחזיר אותן.
| הפרמטר | טיפוס | חובה | המשמעות |
|---|---|---|---|
table |
String | ✔ | שם הטבלה |
where |
Object | תחביר Get-Data |
{ "table": "Accounts", "where": { "IsAccount": false, "createdAt": { "$gte": { "__type": "Date", "iso": "2026-08-01T00:00:00.000Z" } } } }התשובה: {"count": 8}. בלי where: כל הטבלה. זול מ‑Get-Data וחסין למלכודת ה‑limit — על שאלת “כמה”, זו התשובה היחידה שאפשר לסמוך עליה.
Aggregate-Data
Section titled “Aggregate-Data”קיבוץ וצבירה בצד השרת: שורה לכל קבוצה, במקום למשוך 12,000 שורות ולסכם בקוד.
| הפרמטר | טיפוס | חובה | המשמעות |
|---|---|---|---|
table |
String | ✔ | שם הטבלה |
group |
Object | ✔ | { "תווית": { "פונקציה": "שדה" } }. הסכימה מציינת מאפיין אחד, השרת מקבל כמה (ראו למטה) |
groupby |
String | Object | ✔ | לפי מה מקבצים. בלעדיו: groupby: Invalid input: expected nonoptional |
where |
Object | סינון לפני הקיבוץ | |
order |
String | לפי התווית המחושבת; - ליורד, למשל -total |
|
limit |
Number | ברירת מחדל 0 = כל השורות, מקסימום 2000 (2001 נדחה בוולידציה) |
|
timeZone |
String | לחישוב חלקי תאריך, למשל Asia/Jerusalem (hour של 10:00Z חוזר 12). ברירת מחדל: UTC של השרת |
התשובה: { "results": [ { "_id": <ערך-הקיבוץ>, "<תווית>": <ערך> }, … ] }. ב‑groupby מחרוזת _id הוא הערך עצמו; ב‑groupby אובייקט _id הוא אובייקט עם התוויות שלכם.
פונקציות הצבירה
Section titled “פונקציות הצבירה”| הפונקציה | מה היא עושה |
|---|---|
sum |
סכום שדה, {"total":{"sum":"Total"}} · או ספירה, {"count":{"sum":1}} |
avg |
ממוצע |
min / max |
הנמוך / הגבוה בקבוצה |
first / last |
הראשון / האחרון בקבוצה |
first ו‑last קיימים בסכימה החיה, גם אם הם חסרים ברשימות פונקציות ישנות.
groupby
Section titled “groupby”// מחרוזת — שדה אחד{ "table": "Sales", "group": { "total": { "sum": "Total" } }, "groupby": "OwnerId._User.name", "order": "-total", "limit": 10 }// ⇒ {"results":[{"_id":"דנה לוי","total":3600}]}
// אובייקט — כמה שדות, ותוויות משלכם{ "table": "Sales", "group": { "total": { "sum": "Total" } }, "groupby": { "month": { "mm": "ClosingDate" }, "status": "SaleStatusId.SaleStatuses.Name" } }// ⇒ {"results":[{"_id":{"month":1,"status":"חדש"},"total":300}, …]}מסלול Pointer נכתב FieldName.TargetClassName.TargetFieldName, שם המחלקה באמצע. אגרגציית REST הגולמית לא יודעת זאת: כשצריך שמות ולא מזהים, השתמשו בכלי הזה.
חלקי תאריך: hour, dow (1 = ראשון), q, q/yy (⇒ {"yy":2026,"q":1}), mm, mm/yy (⇒ {"yy":2026,"mm":3}), yy. תמיד בצורת האובייקט: { "label": { "mm": "ClosingDate" } }.
הכנסות לפי בעלים
Section titled “הכנסות לפי בעלים”{ "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 }Create-Data
Section titled “Create-Data”יוצר רשומה אחת.
| הפרמטר | טיפוס | חובה | המשמעות |
|---|---|---|---|
table |
String | ✔ | שם הטבלה |
data |
Object | ✔ | מפת שדה → ערך |
{ "table": "Tasks", "data": { "Name": "לחזור ללקוח", "DueDate": { "__type": "Date", "iso": "2026-09-01T09:00:00.000Z" }, "AccountId": { "__type": "Pointer", "className": "Accounts", "objectId": "xK9mP2qRsT" }, "OwnerId": { "__type": "Pointer", "className": "_User", "objectId": "2b0QVKoigE" } } }התשובה: { "objectId": "LyRGHAc68z", "createdAt": "2026-08-23T11:16:22.956Z" }.
אין דגלי דילוג: טריגרים ירוצו (טריגר create על הטבלה יוצר את רשומת הבת שלו), וכך גם רישום ציר הזמן אם מוגדר לטבלה. השורה ב‑_Timeline נרשמת עם user.objectId === "Master".
Create-Many
Section titled “Create-Many”יוצר רשומות בכמות. כלי העבודה של כל טעינת נתונים.
| הפרמטר | טיפוס | חובה | המשמעות |
|---|---|---|---|
table |
String | ✔ | שם הטבלה |
data |
Array<Object> | ✔ | מערך רשומות, כל אחת כמו ב‑Create-Data |
skipTriggers |
Boolean | מדלג על כל טריגרי היצירה של הטבלה (עם הדגל לא נוצרת רשומת הבת של הטריגר; בלעדיו — כן) | |
skipTimeline |
Boolean | ללא רישום ל‑_Timeline (0 שורות מול 1 בלעדיו) |
{ "table": "Accounts", "skipTriggers": true, "data": [ { "Name": "לקוח א'", "PhoneNumber": "0501234567", "IsAccount": false }, { "Name": "לקוח ב'", "PhoneNumber": "0507654321", "IsAccount": false } ] }התשובה: מערך בסדר הקלט, פריט לכל רשומה.
[ { "success": { "objectId": "ivgBTJUiUZ", "createdAt": "2026-08-23T11:16:14.069Z" } }, { "success": { "objectId": "TqbPMxcyAG", "createdAt": "2026-08-23T11:16:14.069Z" } } ]הסדר נשמר בדיוק כסדר השליחה. כך מקשרים שורות מקור לרשומות שנוצרו בטעינת שתי טבלאות ברצף (מתכונים).
skipTimeline מקטין את יכולת המעקב; יומנים וראיות מפרט מה מאבדים.
גודל אצווה: עד ~50 רשומות לקריאה. אין מגבלה בסכימה, ואצוות של 60 ו‑120 עוברות, אבל מאות מזהים בתשובה מכבידים על הקשר המודל. לסטים גדולים: לולאת אצוות. ב‑batch של REST ההמלצה 50 אינה נאכפת (1,000 פעולות עוברות), ודגלי דילוג אין לו כלל.
Update-Data
Section titled “Update-Data”מעדכן רשומה אחת קיימת.
| הפרמטר | טיפוס | חובה | המשמעות |
|---|---|---|---|
table |
String | ✔ | שם הטבלה |
objectId |
String | ✔ | מזהה הרשומה. בדיוק 10 תווים |
data |
Object | ✔ | שדות לעדכון בלבד; שדה שלא נשלח לא משתנה |
{ "table": "Sales", "objectId": "V0sVNyS45K", "data": { "SaleStatusId": { "__type": "Pointer", "className": "SaleStatuses", "objectId": "zrP1MSVBoq" }, "Total": { "__op": "Increment", "amount": 500 }, "ClosingDate": { "__type": "Date", "iso": "2026-09-30T00:00:00.000Z" } } }התשובה: objectId, updatedAt, והשדות שחושבו בשרת (למשל "Total": 510 אחרי Increment). מזהה שאינו קיים ⇒ Error: Object not found.
{"__op": "Increment", "amount": n} מגדיל שדה מספרי בצד השרת, בלי מרוץ בין קריאה לכתיבה. ערך שלילי מקטין.
אין עדכון בכמות. עדכון גורף: לולאה של Update-Data, או batch ב‑REST.