您这里的语法不是“严格”的猫鼬语法,所以不确定您是否在此之上实现了其他层。
但您真正想要的是 .findOneAndUpdate(),如 mongoose 文档中所述。基本上,这将在一次调用中完成您的全部更新,您可以这样称呼它:
Incident.findOneAndUpdate(
{ "_id": someID1, "alertees._id": someID2 },
{ "alertees.$.responded_at": Date.now() },
function(err,incident) {
if (err) throw err; // or do something like return the error
if ( incident != null ) {
incident.altertees.some(function(alertee) {
if ( alertee._id.toString() == someID2.toString() ) {
console.log( alertee );
return 1;
}
});
} else {
console.log( "not found" );
}
}
);
这是最有效的更新表单,它还会返回更改后的文档。在响应回调中,我使用 Array#some 只是为了匹配已更新并按原样返回的“alertee”。
当然,这不会调用在您的“模式”上定义的任何方法或挂钩,但是对于仅更新日期而言,您不太可能需要它。如果你这样做了,你可以像你一样使用.findOne() 和.save(),但是像我在更新之前那样匹配数组元素。
或者作为一个更完整的例子:
var async = require('async'),
mongoose = require('mongoose'),
Schema = mongoose.Schema,
ObjectId = require('mongodb').ObjectID;
mongoose.connect('mongodb://localhost/test');
var alerteeSchema = new Schema({
"responded_at": Date
});
var incidentSchema = Schema({
alertees: [alerteeSchema]
});
var Incident = mongoose.model( "Incident", incidentSchema );
var incident = new Incident();
var date1 = new Date();
var date2 = new Date(
date1.valueOf() - ( date1.valueOf() % 1000 * 60 * 60 * 24 )
);
incident.alertees.push({ "responded_at": date1 });
incident.alertees.push({ "responded_at": date2 });
incident.save(function(err,incident) {
if (err) throw err;
var someID1 = incident._id;
var someID2 = incident.alertees[1]._id;
//var someID2 = new ObjectId();
console.log( "before: \n" + incident );
Incident.findOneAndUpdate(
{ "_id": someID1, "alertees._id": someID2 },
{ "alertees.$.responded_at": Date.now() },
function(err,incident) {
if (err) throw err;
if (incident != null) {
incident.alertees.some(function(alertee) {
console.log( "test: " + alertee );
if ( alertee._id.toString() == someID2.toString() ) {
console.log( "after: \n" + alertee );
return 1;
}
});
} else {
console.log( "not found" );
}
}
);
});
有了这些结果:
before:
{ __v: 0,
_id: 53aba6c73b8d05ef77c2703b,
alertees:
[ { responded_at: Thu Jun 26 2014 14:51:19 GMT+1000 (EST),
_id: 53aba6c73b8d05ef77c2703c },
{ responded_at: Thu Jun 26 2014 08:58:31 GMT+1000 (EST),
_id: 53aba6c73b8d05ef77c2703d } ] }
test: { responded_at: Thu Jun 26 2014 14:51:19 GMT+1000 (EST),
_id: 53aba6c73b8d05ef77c2703c }
test: { responded_at: Thu Jun 26 2014 14:51:19 GMT+1000 (EST),
_id: 53aba6c73b8d05ef77c2703d }
after:
{ responded_at: Thu Jun 26 2014 14:51:19 GMT+1000 (EST),
_id: 53aba6c73b8d05ef77c2703d }