Mongoose无法将ref -Schema.Types.ObjectId-设置为其他文档

时间:2014-08-02 13:20:39

标签: node.js mongodb mongoose

我试图根据文档http://mongoosejs.com/docs/populate.html使用猫鼬保存文档 首先我调用parent.save并在parent.save的回调中使用child.save。 但是,当我检查parent.childs时,我可以看到没有添加任何孩子。 父模式是Home:

var HomeSchema  = new Schema({


    password : String,
    draft :   { type: Boolean, default: true },
    edited :   { type: Boolean, default: false },
    guests : [{type : Schema.Types.ObjectId, ref : 'Guest'}],

    _event : {type : Schema.Types.ObjectId, ref : 'Event'}

});

子模式是Guest:

var GuestSchema = new Schema({

    _home : {type : Schema.Types.ObjectId, ref : 'Home'},
    firstname : String,
    lastname : String,
    coming : { type: String, default: 'dnk-coming' },
    phone : String,
    email : String,
    address : String,
    edited :   { type: Boolean, default: false },
    draft :  { type: Boolean, default: true }

});

为避免任何误解,您必须知道我的用户架构中包含这两个架构:

var userSchema = mongoose.Schema({
    homes:[homeSchema.HomeSchema],
    events:[eventSchema.EventSchema],
    guests:[eventSchema.guestSchema],

});

现在你应该拥有所有必需的信息来完全理解执行:

  UserModel.findById(user._id, function(err, userFound) {
    if (!err) {
      /* cleaning draft*/
      userFound.homes = that.clean(userFound.homes);
      /* setting draft */
      var HomeModel = mongoose.model("Home");
      var homeModel = new HomeModel();
      homeModel.draft = true;


      if (userFound.homes === null) {
        userFound.homes = [];
      }

      homeModel.save(function(err) {
        if (!err) {
          var GuestModel = mongoose.model("Guest");
          var guestModel = new GuestModel();
          guestModel._home = homeModel._id;

          guestModel.save(function(err) {
            if (!err) {
                // @ma08 : According to the doc this line should'nt be required
                //homeModel.guests.push(guestModel._id);  so when I use this obviously the id is correctly set but when I try a populate after saving the populate do not work 
              userFound.homes.push(homeModel);
              userFound.guests.push(guestModel);
              userFound.save(function(err) {
                if (!err) {
                  successCallback();
                }
                else {
                  errorCallback();
                }
              });
            }
          });
        }
      });

此处理不会导致任何错误。但是当我对用户进行字符串化时,它并没有按预期工作:我得到了:

guests: 
   [ { coming: 'dnk-coming',
       edited: false,
       draft: true,
       _id: 53dcda201fc247c736d87a95,
       _home: 53dce0f42d5c1a013da0ca71,
       __v: 0 }]

绝对没问题我得到_home id等... 然后我将user.homes字符串化,然后我得到:

  homes: 
   [ { draft: true,
       edited: false,
       guests: [],
       _id: 53dce0f42d5c1a013da0ca71,
       __v: 0 } ]

根据文件,客人应该被设置,但它不是< - 这是我的问题。请帮我弄清楚我做错了什么。我可以手动设置它,但根据文档,我认为不应该以这种方式工作。

1 个答案:

答案 0 :(得分:3)

guestModel.save(function(err) {...

这是错误的,因为您将来宾嵌入userSchema。 因此,请跳过guestModel.save中的pushguestModel中的userFound {/ 1}}

嵌入式文档永远不能引用。您无法在不获取父文档的情况下指向它。因此,您无法嵌入并保留对嵌入文档的引用。您应该在嵌入或添加引用之间进行选择。

我的建议是设计这样的模式。将guests存储在单独的集合中。将引用存储在guestuser架构中的home。如果您想存储一些关系数据,您可以像[{guestId:{type:Schema.Types.ObjectId,ref:'Guest'},field1:{type:...},field2:{...}..]一样存储参考,如果您只想要参考[{type:Schema.Types.ObjectId,ref:'Guest'}]