Мангуста Инкреймент увеличивает весь массив объектов - PullRequest
0 голосов
/ 25 сентября 2018

Я пытаюсь начать сохранять статистику по пользователям (для несогласного бота), такую ​​как использование команд и так далее.

Я хочу сохранить все это в моем mongodb.По сути, я пытаюсь реализовать возможность периодически обновлять базу данных из массива, который сохраняет использование команд пользователей, а затем очищает / стирает после обновления информации в базе данных.

Моя схема выглядит следующим образом:

const userStatsSchema = new Schema({
    _id: mongoose.Schema.Types.ObjectId,
    userID: String,
    commandUsage: {
        command1: {
            type: Number,
            default: 0
        },
        command2: {
            type: Number,
            default: 0
        },
        command3: {
            type: Number,
            default: 0
        },
        command4: {
            type: Number,
            default: 0
        },
        command5: {
            type: Number,
            default: 0
        }
    }
})
const UserStats = mongoose.model('global_users', userStatsSchema);

Честно говоря, я понятия не имею, куда идти, когда дело доходит до их обновления сразу.Имейте в виду, что массив commandUsage намного больше этого и постоянно растет.

Нужно ли увеличивать каждый из них по отдельности или есть лучший способ?

$inc: commandUsage: { command1: 5, command2: 8, command3: 2, command4: 0 }

Любойпомощь в выяснении этого будет принята с благодарностью!

1 Ответ

0 голосов
/ 25 сентября 2018

Вы можете использовать массовые операции , которые будут выполняться через фиксированный интервал (время или число событий)

const UserStats = mongoose.model( 'global_users' );
const bulk = UserStats.collection.initializeOrderedBulkOp();
const maxNbrOfCommandAtOnce = 1000; // if you want to use an interval based on the nbr of commands
const interval = 10000; // to set an interval  of 10 sec

let saveBulkInterval = setInterval(executeBatch, interval);

const onCommand = function(event) {
    // I guess here that you have the ID of the item you to modify
    bulk.find({_id: itemId}).update({$inc: {event.commandName: 1}});

    if (bulk.s.currentBatchSize === maxNbrOfCommandAtOnce)
        executeBatch();
};

const executeBatch = function() {
    if (bulk.s.currentBatchSize > 0) {
        bulk.execute(function() {
            bulk = UserStats.collection.initializeOrderedBulkOp();
        });
    }
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...