我想添加一个带值的键,或者如果键存在则更新值。 目前我正在进行2次通话。我得到了对象,然后我正在改变它。它希望能够立刻做到这一点。我担心的是,函数在短时间内被调用两次,第二次调用不会获得更新的对象。
我的问题是我正在为另一个网络服务器创建的对象添加密钥。
我的方法有危险吗?第二次调用是等待更新完成还是我必须以某种方式阻止数据库?
如何在作为对象一部分的更新中添加密钥? 带有数据的Object如下所示。
{
key: "20170606000000$BgMKClY@$BgYEA10F@",
value: {
"quantity" : "0.3",
"hourbooking_id" : "$BgECBlECDg@"
}
}
架构如下:
var Hours = new Schema({
_id: ObjectId,
hours: {}
});
我的代码如下所示:
this.findHoursById = function(_id, callback){
Hours.findOne({
_id: _id
}, function(err, chours){
if(err || chours === null){
callback({
success: false,
error: 'User not found'
})
}else{
callback({
success: true,
error: 'none',
hours: chours.hours
});
}
})
};
this.addHours = function(_id, hours, callback){
var insertHours = {};
this.findHoursById(_id, function(result){
if(result.success){
insertHours = result.hours
}
insertHours[hours.key] = hours.value;
var CHours = new Hours({
_id: _id
});
CHours.update({$set: {hours: insertHours}}, {upsert: true}, function(err, num, n){
if (err){
console.log(err);
callback({ success: false, error: 'update hours error' });
//throw err;
}else{
callback({ success: true, error: 'none' });
}
});
});
};
结果应如下所示
{
"_id" : ObjectId("593e714b142174142c068a03"),
"hours" : {
"20170612000000$Bg8HC1M@$BgECBVYP@" : {
"quantity" : "0.5",
"hourbooking_id" : "$Bg8FB1EPDw@"
},
"20170612000000$Bg8HC1M@$AQQCBV0C@" : {
"quantity" : "1.1",
"hourbooking_id" : "$Bg8KAFwECw@"
}
},
"__v" : 0
}
我希望用ObjectId更新每个elemt(" 593e714b142174142c068a03")
到
{
"_id" : ObjectId("593e714b142174142c068a03"),
"hours" : {
"20170612000000$Bg8HC1M@$BgECBVYP@" : {
"quantity" : "0.5",
"hourbooking_id" : "$Bg8FB1EPDw@"
},
"20170612000000$Bg8HC1M@$AQQCBV0C@" : {
"quantity" : "1.1",
"hourbooking_id" : "$Bg8KAFwECw@"
},
"20170612000000$Bg8HC1M@$AQQCDDDC@" : {
"quantity" : "1.1",
"hourbooking_id" : "$Bg8KAFPPPw@"
}
},
"__v" : 0
}
这是一个好主意吗?或者更好的存储创建一对objectid和新键这样?
{
"user_id" : ObjectId("593e714b142174142c068a03"),
"comparekey : "20170612000000$Bg8HC1M@$BgECBVYP@" :
"values" : {
"quantity" : "0.5",
"hourbooking_id" : "$Bg8FB1EPDw@"
},
"__v" : 0
}