Javascript 如何升级MongoCollection,但保留一些值?

Javascript 如何升级MongoCollection,但保留一些值?,javascript,mongodb,meteor,collections,Javascript,Mongodb,Meteor,Collections,嗨, 我不知道如何给它起个好标题,但我相信你会理解的 因此,当用户单击按钮时,我尝试在我的Mongo集合上设置2个字段,但每60秒,我就有一个正在运行的方法,是谁创建的: upsertCollectionMachines = Meteor.bindEnvironment(function() { machinesCount = 0; var protocol; var port; Machine.list({

嗨, 我不知道如何给它起个好标题,但我相信你会理解的

因此,当用户单击按钮时,我尝试在我的Mongo集合上设置2个字段,但每60秒,我就有一个正在运行的方法,是谁创建的:

  upsertCollectionMachines = Meteor.bindEnvironment(function() {
      machinesCount = 0;
        var protocol;
        var port;
        Machine.list({
            inspect: true
        }, Meteor.bindEnvironment(function(err, machines) {
            if (typeof machines === "undefined") {
                console.error("Impossible to access 'machines' from 'Machine.list:  '" + err);
            } else {
                machines.forEach(Meteor.bindEnvironment(function(machineInfo) {
                    machinesCount += 1;
                    if (machineInfo.url != null) {
                        var urlToArray = machineInfo.url.split(":")
                        port = urlToArray[urlToArray.length - 1];
                        protocol = "https";
                    } else {
                        port = "2376";
                        protocol = "https";
                    }
                    InfosMachines.upsert({
                        nameMachine: machineInfo.name,
                    }, {
                        nameMachine: machineInfo.name,
                        stateMachine: machineInfo.state,
                        ipAddr: machineInfo.driver.ipAddress,
                        port: port,
                        protocol: protocol
//here I want to add isUsed: false,  
//whoUseIt: "", but I think if I set isUsed true --> after 60s it will be false again right ?
                    });
                }));
                if (apiKeyGenerated == false) {
                    getTheAPIKeyGrafana(function(err, res) {
                        if (!err) {
                            apiKeyGenerated = true;
                            updateDashboard();
                        } else {
                            console.error(err);
                        }
                    });
                }else{
                  updateDashboard();
                }
            }
        }));
    })
其中重要的部分是
InfosMachines.upsert()
。现在我想设置如下两个字段:

'lockTheMachine': function(nameMachine, nameUser){
        InfosMachines.upsert({
            nameMachine: nameMachine,
        }, {
            nameMachine: nameMachine,
            isUsed: true,
            whoUseIt: nameUser
        });
        //upsertCollectionMachines();
        console.log(nameUser +" has locked the machine: " + nameMachine);
        },
但首先,它看起来不像是将2个字段添加到集合中,其次,60秒间隔方法将删除它们,对吗


谢谢你的帮助

在你的问题中,要准确地理解你想做什么有点困难,但我想我明白了主要要点

基本上,您希望
lockTheMachine()
函数upsert只设置
nameMachine
被使用
,以及
谁使用它
字段,并且只希望
upsertCollectionMachines()
设置
stateMachine
ipAddr
端口
protocol
字段更新时,仅将
isUsed
whoUseIt
设置为插入时的默认值

您应该能够使用下面的upserts来实现这一点

upsertCollectionMachines()函数中使用此upsert

InfosMachines.upsert({
  nameMachine: machineInfo.name,
}, {
  $set: {
    stateMachine: machineInfo.state,
    ipAddr: machineInfo.driver.ipAddress,
    port: port,
    protocol: protocol
  },
  $setOnInsert: {
    isUsed: false,
    whoUseIt: "",
  }
});
InfosMachines.upsert({
  nameMachine: nameMachine,
}, {
  $set: {
    isUsed: true,
    whoUseIt: nameUser
  }
});
它将始终设置
状态机
ipAddr
端口
协议
字段,无论是插入还是更新,但仅在插入时修改
已使用
谁使用它
(因此,它不会覆盖从其他函数设置的值)

锁定机器()
函数中使用此向上插入

InfosMachines.upsert({
  nameMachine: machineInfo.name,
}, {
  $set: {
    stateMachine: machineInfo.state,
    ipAddr: machineInfo.driver.ipAddress,
    port: port,
    protocol: protocol
  },
  $setOnInsert: {
    isUsed: false,
    whoUseIt: "",
  }
});
InfosMachines.upsert({
  nameMachine: nameMachine,
}, {
  $set: {
    isUsed: true,
    whoUseIt: nameUser
  }
});
它只会插入或更新这两个特定字段(
isUsed
whoUseIt

现在,为什么这样做?首先,我们使用(而不是仅使用
field:value
表达式)只允许您在需要时更新特定字段,并且使用
$setOnInsert
确保我们仅在插入时修改这些字段。请注意,如果upsert确定需要插入新文档,根据,它将使用创建一个新文档

如果
参数包含更新运算符表达式,则
参数的字段和值


这意味着您不必在更新表达式中明确地设置
$set
名称机器
字段。

我有一个想法,我会打开这个线程,但我的想法是为二手机器创建第二个集合Shi Jerome;当你说它看起来不像是添加了两个字段时,你能准确地显示出你对数据的预期结果,以及它实际更新了什么吗?@VinceBowdren我明天会做,我戳你嗨,首先谢谢你,这是我得到的最好的答案!你的解释很好!该系列按照我的要求进行了更新,因此非常完美:)