用$ push理解upsert

时间:2016-09-07 16:46:20

标签: javascript mongodb mongoose

我有一个地区集合:

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是不必要的?

1 个答案:

答案 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();
});