在更新时在mongodb中添加动态密钥

时间:2017-06-11 20:50:54

标签: node.js mongodb mongoose

我想添加一个带值的键,或者如果键存在则更新值。 目前我正在进行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
}

0 个答案:

没有答案