我正在处理node.js,mongodb和express中必须处理事务的项目。 我可以将变量硬编码到mongodb中,但如果不是所有字段都被填写(并非所有字段都是必需的)那么我只是将空数据放入数据库中。
此代码有效:
var d = new Date();
var n = d.toJSON();
var date = n;
var address = req.body.property_address;
var client_name = req.body.client_name;
var sales_price = req.body.sales_price;
var commission_percent = req.body.commission_percent;
var referral = req.body.referral;
var donation = req.body.donation;
var client_source = req.body.client_source;
var client_type = req.body.client_type;
var notes = req.body.notes;
Transaction.findOne({ name: { $regex: new RegExp(date, "i") } },
function(err, doc){
if(!err && !doc) {
console.log("there is no error, and this does not already exist");
var newTransaction = new Transaction();
newTransaction.date = date;
newTransaction.address = address;
newTransaction.client_name = client_name;
newTransaction.sales_price = sales_price;
newTransaction.commission_percent = commission_percent;
newTransaction.referral = referral;
newTransaction.donation = donation;
newTransaction.client_source = client_source;
newTransaction.client_type = client_type;
newTransaction.notes = notes;
newTransaction.save(function(err) {
if(!err){
console.log("successfully saved");
res.json(200, {message: newTransaction.date});
} else {
res.json(500, {message: "Could not create transaction. Error: " + err})
}
});
}
});
但是,将一个不存在于mongodb中的值放入是什么意义?这不应该是令人敬畏的东西之一吗?而我的想法是,它会带走我将来可能会做的查询。
是否有可能做更像这样的事情?
Transaction.findOne({ name: { $regex: new RegExp(date, 'i' ) } },
function(err, doc){
if(!err && !doc){
var newTransaction = new Transaction();
for(var key in req.body){
newTransaction.key = req.body[key];
}
}
}
});
这是我最终使用的代码。
Transaction.findOne({ name: { $regex: new RegExp(date, "i") } },
function(err, doc){
if(!err && !doc){
var newTransaction = new Transaction();
for(var key in req.body){
if(req.body[key] != ''){
newTransaction[key] = req.body[key];
}
}
}
}
});
答案 0 :(得分:1)
这是非常好的行为。您仍然可以查询所有文档中不存在的字段,因为不存在的字段与不相等的字段相同。
这意味着文档的松散定义仍然保留。
答案 1 :(得分:0)
对我来说很好,但我可能不想仅仅依赖于任何客户端数据作为密钥,具体取决于您的部署方式。
也许:
['date', 'address', 'client_name'/*,...*/].forEach(function(key)
{
/* ... */
if (key in req.body) newTransaction[key] = req.body[key];
});