كيفية إزالة التكرارات من قائمة الوظائف الشاغرة من استجابة API في نفس الحمولة

صف المشكلة/الخطأ/السؤال

كل وظيفة شاغرة لها معرّف خارجي (external_id) فريد، لكن البعض يظهر عدة مرات في نفس استجابة واجهة برمجية التطبيقات.

هدفي:

السماح بعنصر واحد فقط من كل وظيفة شاغرة
تصفية النسخ المكررة داخل نفس الحمولة
بدون فحص Supabase، لأن قاعدة البيانات لا تزال فارغة

أستخدم عقدة Code في وضع “Run Once for All Items” للكشف عن النسخ المكررة.

ما هي رسالة الخطأ (إن وجدت)؟

يرجى مشاركة سير العمل الخاص بك

(حدد العقد على لوحتك واستخدم اختصارات لوحة المفاتيح CMD+C/CTRL+C و CMD+V/CTRL+V لنسخ ولصق سير العمل.)

شارك المخرجات التي يعيدها آخر عقدة

معلومات حول إعداد n8n الخاص بك

  • إصدار n8n:
  • قاعدة البيانات (الافتراضية: SQLite):
  • إعداد n8n EXECUTIONS_PROCESS (الافتراضي: own, main):
  • تشغيل n8n عبر (Docker, npm, n8n cloud, تطبيق سطح المكتب):
  • نظام التشغيل:

@haajj3012 عقدة الكود في وضع “Run Once for All Items”:

const seen = new Set();
return $input.all().filter(item => {
  const id = item.json.external_id;
  if (seen.has(id)) return false;
  seen.add(id);
  return true;
});

يصدر عنصر واحد لكل external_id فريد، ويتجاهل الباقي. إذا كنت تريد الاحتفاظ بواحد معين (الأحدث حسب التاريخ، الإصدار الأعلى، إلخ) بدلاً من “الأول الملاحظ” فأخبرني.

مرحباً @haajj3012،
كود @achamm يعمل بشكل مثالي. أضيف فقط
خيار بدون أكواد في حالة فضلت الحفاظ على الأشياء مرئية في
سير العمل:

n8n لديها عقدة Remove Duplicates مدمجة تفعل بالضبط
هذا دون كتابة أي جافاسكريبت. الإعداد:

  1. ضع عقدة Remove Duplicates بعد استدعاء API الخاص بك
  2. العملية: “Remove Items With Same Field Value”
  3. حقل المقارنة: external_id

ستقوم بتصفية المصفوفة لتصبح عناصر فريدة في عقدة واحدة، مما يسهل
رؤيتها في لوحة الرسم لاحقاً عند تصحيح الأخطاء.

هناك حالات حدية قليلة تستحق الاهتمام مهما كان النهج الذي تختاره:

  • إذا كان external_id غائماً أو null في بعض العناصر، فكل من
    الكود والعقدة ستعامل جميع القيم الفارغة كنسخ مكررة من بعضها.
    عادة لا بأس، لكن إذا أردت الاحتفاظ بالقيم الفارغة،
    أضف مرشح قبل خطوة إزالة التكرار لفصلها.
  • إذا أعادت API الهوية كرقم في بعض العناصر
    وكنص في عناصر أخرى، كلا النهجين سيعاملان "123"
    و 123 كأشياء مختلفة. يصلح هذا بسرعة باستخدام String(item.json.external_id)
    في الكود (أو عقدة Set لتوحيد النوع).

بما أنك ذكرت أن supabase قادمة لاحقاً — عند إضافتها،
النمط الأنظف هو إزالة التكرار داخل الحمولة أولاً
(ما تفعله الآن)، ثم إزالة التكرار مقابل supabase كخطوة
ثانية. يحافظ هذا على المنطق نظيفاً وسهل الاختبار لكل طبقة
بشكل مستقل.

إجابات رائعة من @achamm و @Dharmendra_Kumar – نمط Set + filter في عقدة Code متين جداً، والخيار المرئي مع Remove Duplicates دقيق تماماً لهذه حالة الاستخدام.

بما أن n8n يدعم هذا السيناريو بشكل ممتاز خارج الصندوق بالفعل، فأنا شخصياً سأتجنب عقدة Code هنا وأعتمد بالكامل على العقدة المدمجة. هذا يحافظ على سهولة قراءة سير العمل وعادة ما يكون أكثر استقراراً على المدى الطويل.

للهدف المحدد الخاص بك (“عنصر واحد بالضبط لكل external_id ضمن نفس البيانات، قاعدة البيانات لا تزال فارغة”)، يمكنك تكوين Remove Duplicates على النحو التالي:

• أضف عقدة Remove Duplicates مباشرة بعد عقدة API الخاصة بك.
• اضبط Operation على Remove Items Repeated Within Current Input.
• اضبط Compare → Selected Fields واختر external_id كالحقل.

هذا سيحافظ على العنصر الأول فقط لكل external_id في التنفيذ الحالي وسيسقط جميع النسخ المكررة الإضافية – بالضبط ما وصفته، بدون أي كود إضافي أو فحوصات قاعدة بيانات.

لاحقاً، عندما تبدأ في استخدام Supabase وتريد أيضاً تخطي الشواغر التي عالجتها بالفعل في التشغيلات السابقة، يمكنك ربط عقدة Remove Duplicates ثانية في وضع Remove Items Processed in Previous Executions. بهذه الطريقة تحصل على نمط نظيف “dedupe ضمن البيانات → dedupe مقابل السجل”، كل شيء باستخدام العقد الأصلية.