اذهب إلى المحتوى
  • 0

تحديث البيانات في قاعدة بيانات MongoDB عند تغيير القيم في ملف Google Sheet

Samer Alashqar

السؤال

السلام عليكم..

اقوم بجلب البيانات من google sheet ووضعها في قاعدة البيانات، لكن مشكلتي هي اذا كانت هناك قيمة لاي صف في ملف الشيت وبعد ذلك تم تعديل هذه القيمة الى قيمة جديدة، فإن الكود لدي الذي كتبته لا يقوم بتعديل البيانات القديمة الى بيانات جديدة في قاعدة البيانات، بل يتم تخزين البيانات المعدلة على شكل document جديد دون استبدال القديمة..

ارجو المساعدة.

ملفات المشروع: package.jsonuser.jspackage-lock.jsonindex.js

 

 

تم التعديل في بواسطة Mustafa Suleiman
تعديل عنوان السؤال
رابط هذا التعليق
شارك على الشبكات الإجتماعية

Recommended Posts

  • 0

تفقدت الكود وأنت تستخدم دالة findOneAndUpdate من Mongoose لتحديث البيانات في MongoDB، ولكن السمة userName في مخطط user لديك هي المفتاح الرئيسي والفريد، وهذا هو السبب في أنه عند تحديث قيمة userName لمستند موجود بالفعل، يتم إنشاء وثيقة جديدة بدلاً من تحديث الوثيقة الحالية.

عليك باستخدام الدالة findOneAndUpdate بطريقة معينة ملف index.js على النحو التالي:

// ...

for (const data of updatedData) {
  const user = {
    userName: data[0],
  };

  await User.findOneAndUpdate(
    { userName: user.userName },
    { $set: user },
    { upsert: true }
  );
}

// ...

من خلال إضافة $set في الكائن الثاني لدالة findOneAndUpdate، ستقوم بتحديث الوثيقة الموجودة بدلاً من إنشاء وثيقة جديدة.

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0
بتاريخ 15 دقائق مضت قال Mustafa Suleiman:

تفقدت الكود وأنت تستخدم دالة findOneAndUpdate من Mongoose لتحديث البيانات في MongoDB، ولكن السمة userName في مخطط user لديك هي المفتاح الرئيسي والفريد، وهذا هو السبب في أنه عند تحديث قيمة userName لمستند موجود بالفعل، يتم إنشاء وثيقة جديدة بدلاً من تحديث الوثيقة الحالية.

عليك باستخدام الدالة findOneAndUpdate بطريقة معينة ملف index.js على النحو التالي:

// ...

for (const data of updatedData) {
  const user = {
    userName: data[0],
  };

  await User.findOneAndUpdate(
    { userName: user.userName },
    { $set: user },
    { upsert: true }
  );
}

// ...

من خلال إضافة $set في الكائن الثاني لدالة findOneAndUpdate، ستقوم بتحديث الوثيقة الموجودة بدلاً من إنشاء وثيقة جديدة.

لم تحل المشكلة مازال يقوم باضافة document جديد دون استبدال السابق

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0

لا مشكلة، حاول تجربة تعديل الكود كالتالي في index.js:

for (const data of updatedData) {
  const user = {
    userName: data[0],
  };

  await User.findOneAndUpdate(
    { userName: user.userName },
    user,
    { upsert: true }
  );
}

ثم تأكد من أن السمة userName في مخطط user معرفة كفهرس فريد في مجموعة البيانات الخاصة بك في MongoDB، من خلال إضافة الخاصية index: { unique: true } إلى تعريف السمة userName في ملف user.js كما يلي:

const userSchema = new mongoose.Schema({
  userName: {
    type: String,
    unique: true,
    required: true,
    index: { unique: true }, // تعريف الفهرس الفريد
  },
  
});

وعليك بإعادة تشغيل الخادم لتطبيق التغييرات.

وإذا استمرت المشكلة، أنصحك بقراءة المستند الرسمي، وهو يوفر مثال عن كيفية فعل ذلك من خلال الرابط التالي:

وهناك أيضًا Batch update:

وبناءًا على المستند الرسمي لتحديث القيم في ورقة جوجل بناءً على الوثائق الرسمية لواجهة برمجة التطبيقات Google Sheets API، يجب تعديل الكود في ملف index.js كما يلي:

// ...

async function googleSheets() {
  const auth = new google.auth.GoogleAuth({
    keyFile: "credentials.json",
    scopes: "https://www.googleapis.com/auth/spreadsheets"
  });

  // إنشاء العميل
  const client = await auth.getClient();
  const googleSheets = google.sheets({ version: "v4", auth: client });

  const spreadsheetId = process.env.SPREADSHEETS_ID;
  const range = "Sheet1!A2:B"; // تحديد النطاق الذي ترغب في تحديثه

  // جلب البيانات الحالية
  const getRows = await googleSheets.spreadsheets.values.get({
    spreadsheetId,
    range,
  });

  const currentData = getRows.data.values;

  // تعديل البيانات
  const updatedData = currentData.map((row) => {
    // قم بتطبيق المنطق الخاص بك هنا لتحديث البيانات
    const updatedValue = "New Value"; // القيمة المحدثة
    return [row[0], updatedValue]; // قم بتعديل العمود الثاني فقط، يمكنك تعديله وفقًا لاحتياجاتك
  });

  // تحديث القيم في الورقة
  await googleSheets.spreadsheets.values.update({
    spreadsheetId,
    range,
    valueInputOption: "USER_ENTERED",
    resource: {
      values: updatedData,
    },
  });
}

// ...

googleSheets();
// تعليق السطر السابق: //setInterval( googleSheets, intervalTime);

// ...

وبإمكانك تعديل الجزء updatedData.map() في الكود وتطبيق المنطق الخاص بك لتحديث البيانات وفقًا لاحتياجات، وتستخدم القيمة المحدثة في السطر const updatedValue = "New Value"; كقيمة جديدة للعمود الثاني، وتستطيع تغيير هذه القيمة وفقًا لما تريده.

وستقوم الوظيفة googleSheets() بجلب البيانات الحالية من ورقة جوجل، ثم تقوم بتطبيق المنطق الخاص بك لتحديث القيم، وأخيرًا تقوم بتحديث البيانات في ورقة جوجل.

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0
بتاريخ 7 ساعة قال Mustafa Suleiman:

لا مشكلة، حاول تجربة تعديل الكود كالتالي في index.js:

for (const data of updatedData) {
  const user = {
    userName: data[0],
  };

  await User.findOneAndUpdate(
    { userName: user.userName },
    user,
    { upsert: true }
  );
}

ثم تأكد من أن السمة userName في مخطط user معرفة كفهرس فريد في مجموعة البيانات الخاصة بك في MongoDB، من خلال إضافة الخاصية index: { unique: true } إلى تعريف السمة userName في ملف user.js كما يلي:

const userSchema = new mongoose.Schema({
  userName: {
    type: String,
    unique: true,
    required: true,
    index: { unique: true }, // تعريف الفهرس الفريد
  },
  
});

وعليك بإعادة تشغيل الخادم لتطبيق التغييرات.

وإذا استمرت المشكلة، أنصحك بقراءة المستند الرسمي، وهو يوفر مثال عن كيفية فعل ذلك من خلال الرابط التالي:

وهناك أيضًا Batch update:

وبناءًا على المستند الرسمي لتحديث القيم في ورقة جوجل بناءً على الوثائق الرسمية لواجهة برمجة التطبيقات Google Sheets API، يجب تعديل الكود في ملف index.js كما يلي:

// ...

async function googleSheets() {
  const auth = new google.auth.GoogleAuth({
    keyFile: "credentials.json",
    scopes: "https://www.googleapis.com/auth/spreadsheets"
  });

  // إنشاء العميل
  const client = await auth.getClient();
  const googleSheets = google.sheets({ version: "v4", auth: client });

  const spreadsheetId = process.env.SPREADSHEETS_ID;
  const range = "Sheet1!A2:B"; // تحديد النطاق الذي ترغب في تحديثه

  // جلب البيانات الحالية
  const getRows = await googleSheets.spreadsheets.values.get({
    spreadsheetId,
    range,
  });

  const currentData = getRows.data.values;

  // تعديل البيانات
  const updatedData = currentData.map((row) => {
    // قم بتطبيق المنطق الخاص بك هنا لتحديث البيانات
    const updatedValue = "New Value"; // القيمة المحدثة
    return [row[0], updatedValue]; // قم بتعديل العمود الثاني فقط، يمكنك تعديله وفقًا لاحتياجاتك
  });

  // تحديث القيم في الورقة
  await googleSheets.spreadsheets.values.update({
    spreadsheetId,
    range,
    valueInputOption: "USER_ENTERED",
    resource: {
      values: updatedData,
    },
  });
}

// ...

googleSheets();
// تعليق السطر السابق: //setInterval( googleSheets, intervalTime);

// ...

وبإمكانك تعديل الجزء updatedData.map() في الكود وتطبيق المنطق الخاص بك لتحديث البيانات وفقًا لاحتياجات، وتستخدم القيمة المحدثة في السطر const updatedValue = "New Value"; كقيمة جديدة للعمود الثاني، وتستطيع تغيير هذه القيمة وفقًا لما تريده.

وستقوم الوظيفة googleSheets() بجلب البيانات الحالية من ورقة جوجل، ثم تقوم بتطبيق المنطق الخاص بك لتحديث القيم، وأخيرًا تقوم بتحديث البيانات في ورقة جوجل.

شكرا على مساعدتك لكن يبدو انني لم اوضح المشكلة جيداً..
MongoDB لا يقوم باستبدال القيمة القديمة بالجديدة والسبب انه لا يملك القيمة القديمة لكي يعمل مقارنة، احتاج الى ان اراقب ملف الشيت في حال حدث اي تغيير .

هل هناك طريقة ؟

 

رابط هذا التعليق
شارك على الشبكات الإجتماعية

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...