// Команды mongosh для исправления незасчитанных рефералов // Выполняйте по порядку // ============================================ // БЫСТРАЯ КОМАНДА ДЛЯ ИСПРАВЛЕНИЯ ВСЕХ РЕФЕРАЛОВ // ============================================ // Скопируйте и выполните эту команду - она засчитает всех, у кого есть 2+ даты или возраст >24ч // // load('backend/scripts/fixAllReferrals.mongosh.js') // // ИЛИ выполните команды ниже вручную // ============================================ // 1. НАЙТИ ВСЕХ ПОЛЬЗОВАТЕЛЕЙ С REFERREDBY (независимо от referralCounted) // ============================================ db.users.find({ referredBy: { $exists: true, $ne: null } }).forEach(function(user) { print("Пользователь: " + (user.username || user._id)); print(" Реферер ID: " + user.referredBy); print(" Засчитан: " + (user.referralCounted || false)); print(" Дат входа: " + (user.loginDates ? user.loginDates.length : 0)); if (user.loginDates && user.loginDates.length > 0) { print(" Даты: " + user.loginDates.map(function(d) { return new Date(d).toLocaleDateString('ru-RU'); }).join(', ')); } print("---"); }); // ============================================ // 2. НАЙТИ ВСЕХ С REFERREDBY И НЕ ЗАСЧИТАННЫХ (включая null и false) // ============================================ db.users.find({ referredBy: { $exists: true, $ne: null }, $or: [ { referralCounted: { $exists: false } }, { referralCounted: null }, { referralCounted: false } ] }).forEach(function(user) { print("Пользователь: " + (user.username || user._id)); print(" Реферер ID: " + user.referredBy); print(" Дат входа: " + (user.loginDates ? user.loginDates.length : 0)); print("---"); }); // ============================================ // 3. ПРОВЕРИТЬ КОНКРЕТНОГО РЕФЕРЕРА (замените USER_ID) // ============================================ // db.users.find({ referredBy: ObjectId("69090d0b52ac792c78253963") }).forEach(function(u) { // print(u.username + " - засчитан: " + (u.referralCounted || false) + ", дат: " + (u.loginDates ? u.loginDates.length : 0)); // }); // ============================================ // 4. ПОСЧИТАТЬ СКОЛЬКО ВСЕГО С REFERREDBY // ============================================ // db.users.countDocuments({ referredBy: { $exists: true, $ne: null } }) // ============================================ // 5. ПОСЧИТАТЬ СКОЛЬКО НЕ ЗАСЧИТАННЫХ // ============================================ // db.users.countDocuments({ // referredBy: { $exists: true, $ne: null }, // $or: [ // { referralCounted: { $exists: false } }, // { referralCounted: null }, // { referralCounted: false } // ] // }) // ============================================ // 6. ЗАСЧИТАТЬ ВСЕХ РЕФЕРАЛОВ С 2+ УНИКАЛЬНЫМИ ДАТАМИ // ============================================ db.users.find({ referredBy: { $exists: true, $ne: null }, $or: [ { referralCounted: { $exists: false } }, { referralCounted: null }, { referralCounted: false } ], loginDates: { $exists: true, $ne: [] } }).forEach(function(user) { // Получить уникальные даты var uniqueDates = new Set(); if (user.loginDates && Array.isArray(user.loginDates)) { user.loginDates.forEach(function(date) { if (!date) return; var d = new Date(date); d.setHours(0, 0, 0, 0); uniqueDates.add(d.getTime()); }); } print("Проверка: " + (user.username || user._id) + " - уникальных дат: " + uniqueDates.size); // Если есть 2+ уникальные даты, засчитать if (uniqueDates.size >= 2) { var referrer = db.users.findOne({ _id: user.referredBy }); if (referrer) { // Увеличить счетчик рефералов var newCount = (referrer.referralsCount || 0) + 1; db.users.updateOne( { _id: referrer._id }, { $set: { referralsCount: newCount } } ); // Пометить как засчитанного db.users.updateOne( { _id: user._id }, { $set: { referralCounted: true, loginDates: [] } } ); print("✅ ЗАСЧИТАН: " + (user.username || user._id) + " -> " + (referrer.username || referrer._id) + " (счетчик: " + newCount + ")"); } } else if (uniqueDates.size > 0) { print("⏳ Нужно еще дат: " + (user.username || user._id) + " (сейчас: " + uniqueDates.size + ")"); } else { print("📅 Нет дат входа: " + (user.username || user._id)); } }); // ============================================ // 7. ПРОВЕРИТЬ РЕЗУЛЬТАТ - СКОЛЬКО РЕФЕРАЛОВ У КОНКРЕТНОГО ПОЛЬЗОВАТЕЛЯ // ============================================ // db.users.findOne({ _id: ObjectId("69090d0b52ac792c78253963") }, { username: 1, referralsCount: 1, referralCode: 1 }) // ============================================ // 8. НАЙТИ ВСЕХ РЕФЕРАЛОВ КОНКРЕТНОГО ПОЛЬЗОВАТЕЛЯ // ============================================ // db.users.find({ referredBy: ObjectId("69090d0b52ac792c78253963") }, { username: 1, referralCounted: 1, loginDates: 1 }).forEach(function(u) { // var dates = u.loginDates ? u.loginDates.length : 0; // print(u.username + " - засчитан: " + (u.referralCounted || false) + ", дат входа: " + dates); // }); // ============================================ // 9. ЗАСЧИТАТЬ ВСЕХ РЕФЕРАЛОВ КОНКРЕТНОГО ПОЛЬЗОВАТЕЛЯ // (замените USER_ID на ID пользователя) // ============================================ var userId = ObjectId("ЗАМЕНИТЕ_НА_ID_ПОЛЬЗОВАТЕЛЯ"); var user = db.users.findOne({ _id: userId }); if (!user) { print("❌ Пользователь не найден!"); } else { print("👤 Пользователь: " + (user.username || user._id)); print(" Текущий счетчик: " + (user.referralsCount || 0)); print("\n🔍 Поиск рефералов...\n"); var fixed = 0; var needMoreDays = 0; db.users.find({ referredBy: userId }).forEach(function(ref) { if (ref.referralCounted === true) { print("✅ " + (ref.username || ref._id) + " - уже засчитан"); return; } var uniqueDates = new Set(); if (ref.loginDates && Array.isArray(ref.loginDates)) { ref.loginDates.forEach(function(date) { if (!date) return; var d = new Date(date); d.setHours(0, 0, 0, 0); uniqueDates.add(d.getTime()); }); } if (uniqueDates.size >= 2) { var newCount = (user.referralsCount || 0) + 1; db.users.updateOne({ _id: userId }, { $set: { referralsCount: newCount } }); db.users.updateOne({ _id: ref._id }, { $set: { referralCounted: true, loginDates: [] } }); user.referralsCount = newCount; print("✅ ЗАСЧИТАН: " + (ref.username || ref._id) + " (счетчик: " + newCount + ")"); fixed++; } else { print("⏳ " + (ref.username || ref._id) + " - нужно еще дат (сейчас: " + uniqueDates.size + ")"); needMoreDays++; } }); var finalUser = db.users.findOne({ _id: userId }); print("\n📊 Засчитано новых: " + fixed); print("📈 Финальный счетчик: " + (finalUser.referralsCount || 0)); } // ============================================ // 10. НАЙТИ ПОЛЬЗОВАТЕЛЯ ПО USERNAME И ИСПРАВИТЬ ЕГО РЕФЕРАЛОВ // ============================================ // var user = db.users.findOne({ username: "USERNAME" }); // if (user) { // var userId = user._id; // // Затем выполните команды из пункта 9, заменив userId // } // ============================================ // 11. УСТАНОВИТЬ referralCounted: false ДЛЯ ВСЕХ С REFERREDBY (если нужно сбросить) // ============================================ // db.users.updateMany( // { // referredBy: { $exists: true, $ne: null }, // referralCounted: { $ne: true } // }, // { // $set: { referralCounted: false } // } // )