我有一个地区集合:
var RegionSchema = new Mongoose.Schema({
name: {type: String},
registrations: [{type: Mongoose.Schema.Types.ObjectId, ref: 'registrations'}],
...
});
注册集合:
var RegistrationSchema = Mongoose.Schema({
firstName: {type: String},
...
});
在我的控制器中,我实例化了一个注册,然后将upsert
选项设置为true
,将其保存到我的区域:
var registration = new Registration(req.body.registration);
...
Region
.update(
{ _id: user.region},
{ $push: {registrations: registration},
{ upsert: true }
)
.exec();
我发现ObjectId("...")
实际上被推到了该地区的注册属性,例如:
{
name: "Northwest",
registrations: [ObjectId("57d038a1466345d52920b194")]
}
但注册集合中没有与_id
匹配的文档。所以我的问题是:我不了解upsert
旗帜的性质;是否不建议在注册时调用save
是不必要的?
答案 0 :(得分:2)
upsert
标志仅适用于您正在操作的集合;在这种情况下,Region
集合。因此,在调用Region.update
时,如果具有该ID的对象不存在,它将创建_id
user.region
的对象。
Mongo不会强制执行严格的ID引用,因此只要ID有效,就可以将ID推送到registrations
。
您需要先保存Registration
对象:
var registration = new Registration(req.body.registration);
registration.save(function() {
Region.update(
{ _id: user.region },
{ $push: { registrations: registration } },
{ upsert: true }
).exec();
});