Javascript 如何升级MongoCollection,但保留一些值?
嗨, 我不知道如何给它起个好标题,但我相信你会理解的 因此,当用户单击按钮时,我尝试在我的Mongo集合上设置2个字段,但每60秒,我就有一个正在运行的方法,是谁创建的: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({
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我明天会做,我戳你嗨,首先谢谢你,这是我得到的最好的答案!你的解释很好!该系列按照我的要求进行了更新,因此非常完美:)