也许是时候了,也许是我淹没在稀疏的文档中,而且无法绕过Mongoose更新的概念:)
这是交易:
我有一个联系方案和模型(缩短属性):
var mongoose = require('mongoose'),
Schema = mongoose.Schema;
var mongooseTypes = require("mongoose-types"),
useTimestamps = mongooseTypes.useTimestamps;
var ContactSchema = new Schema({
phone: {
type: String,
index: {
unique: true,
dropDups: true
}
},
status: {
type: String,
lowercase: true,
trim: true,
default: 'on'
}
});
ContactSchema.plugin(useTimestamps);
var Contact = mongoose.model('Contact', ContactSchema);
Run Code Online (Sandbox Code Playgroud)
我收到客户的请求,其中包含我需要的字段,因此使用我的模型:
mongoose.connect(connectionString);
var contact = new Contact({
phone: request.phone,
status: request.status
});
Run Code Online (Sandbox Code Playgroud)
现在我们解决了这个问题:
contact.save(function(err){...})如果有相同电话号码的联系人已经存在,我将收到错误(正如预期的那样 - 唯一)update()给联系人,因为文件上不存在该方法Contact.update({phone:request.phone}, contact, {upsert: true}, function(err{...})我有一个请求,其中包含数据和_id
如果带有_id的记录存在并且创建一个没有人的代码,那么实现代码的更好方法是什么?我的代码:
var obj = req.body;
Model.findById(obj._id, function(err, data){
if (!data){
var model = new Model(obj)
model.save(function(err, data){
res.send({method: 'create', error: err, data: data})
})
} else {
Model.findByIdAndUpdate(obj._id, obj, function(){
res.send({method: 'update', error: err, data: data})
})
}
Run Code Online (Sandbox Code Playgroud)
我只是想也许有更好的办法.
我使用nodejs/express/mongoose/angularjs.我想更新一个名为Lists的集合,它有几个属性,其中一个是项目数组.在下面的代码中,我在items数组中推送一个新的任务项.一切正常,但更新功能不会发回更新的集合,然后我必须对数据库执行另一个查询.有没有更有效的方法来做到这一点?
nodejs/express代码:
exports.addTaskToList = function(req, res) {
var listId = req.params.Id;
var taskId = req.params.TaskId;
Lists.update({_id: listId}, {$push: {items: taskId}}, {safe:true, upsert: true}, function(err, result){
if(err) {
console.log('Error updating todo list. ' + err);
}
else{
console.log(result + ' todo list entry updated - New task added');
Lists.findById(listId).populate('items').exec(function (err, updatedEntry) {
if (err) {
console.log('Unable to retrieve todo list entry.');
}
res.send(JSON.stringify(updatedEntry));
});
}
});
};
Run Code Online (Sandbox Code Playgroud)
此外,数组项是ObjectIds的数组.这些项目位于单独的模式中,因此位于单独的集合中.是否可以推送整个对象,而不仅仅是其_id,以便不会创建另一个集合?
如何在mongoose中保存编辑后的数据之前进行验证?
例如,如果sample.name数据库中已存在,则用户将收到某种错误,类似于此,这是我的代码,如下所示
//Post: /sample/edit
app.post(uri + '/edit', function (req, res, next) {
Sample.findById(req.param('sid'), function (err, sample) {
if (err) {
return next(new Error(err));
}
if (!sample) {
return next(new Error('Invalid reference to sample information'));
}
// basic info
sample.name = req.body.supplier.name;
sample.tin = req.body.supplier.tin;
// contact info
sample.contact.email = req.body.supplier.contact.email;
sample.contact.mobile = req.body.supplier.contact.mobile;
sample.contact.landline = req.body.supplier.contact.landline;
sample.contact.fax = req.body.supplier.contact.fax;
// address info
sample.address.street = req.body.supplier.address.street;
sample.address.city = req.body.supplier.address.city;
sample.address.state = req.body.supplier.address.state;
sample.address.country = req.body.supplier.address.country;
sample.address.zip = req.body.supplier.address.zip;
sample.save(function …Run Code Online (Sandbox Code Playgroud) 我的mongodb集合中有一个对象.它的架构是:
{
"instruments": ["A", "B", "C"],
"_id": {
"$oid": "508510cd6461cc5f61000001"
}
}
Run Code Online (Sandbox Code Playgroud)
我的收藏可能有这样的对象,但可能没有.我需要检查是否有关键的"乐器"对象存在(请notе,我不知道还有什么价值"仪器"就是在这个时候,它可能包含任何值或数组),如果存在-执行更新,否则 - 插入新值.我怎样才能做到这一点?
collection.find( { "instruments" : { $exists : true } }, function(err, object){
if (object) {
//update
} else {
//insert
}
});
Run Code Online (Sandbox Code Playgroud)
不起作用((
mongoose ×4
node.js ×4
mongodb ×3
express ×2
javascript ×2
exists ×1
insert ×1
updates ×1
validation ×1