猫鼬填充增加整个对象数组

时间:2018-09-25 11:19:02

标签: javascript node.js mongodb mongoose mongodb-query

我正在尝试开始为用户(对于不和谐的bot)保存用户的统计信息,例如命令用法等。

我要将所有内容保存在我的mongodb中。基本上,我正在尝试从可节省用户命令使用率的数组中完成定期更新db的功能,然后在数据库上更新信息后清除/擦除。

我的架构如下:

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 :(得分:0)

您可以使用bulk operations以固定的时间间隔(时间或发生次数)执行

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();
        });
    }
};