Mongoose一对多 - 不太确定如何实现它

时间:2016-03-26 17:01:23

标签: node.js mongodb mongoose

我对Mongoose相对较新(2天就可以了)我希望建立一对多的关系,因为一个人可以来自一个国家,一个国家有很多人。

所以,这就是我所拥有的:

    var userSchema = new Schema({
    name: String,
    username: {
        type: String,
        required: true,
        unique: true
    },
    password: {
        type: String,
        required: true
    },  
    country: {
        type: Schema.Types.ObjectId,
        ref: 'Country'
    }

});
var User = mongoose.model('Person', userSchema);

var countrySchema = new Schema({
    name: {
        type: String,
        required: true,
        unique: true
    },
    created_at: Date,
    updated_at: Date,
    people: [{
        type: Number,
        ref: 'User'
    }]
});

var Country = mongoose.model('Country', countrySchema);

var UK = new Country({
    name: 'UK'
});


usa.save(function(err) {
    var user = new User({
        username: 'James',
        password: 'Bond',
        country: UK._id
    });

    user.save(function(err) {

    });

});

现在我有两个问题:1)我已经看到ref有时可能是ObjectId或只是一个数字 - 差异是什么? 2)保存数据时,在我的情况下,我将国家保存到某个人(通过_id),如何将人员保存到某个国家/地区?我应该更新模型的实例吗?

由于

更新

由于此问题已被标记为重复,请让我重新解释一下这个问题:请考虑此链接中的官方示例:http://mongoosejs.com/docs/populate.html 这个想法是一个人有很多故事,一个故事有一个作者(人)。因此,节省如下:

    var aaron = new Person({ _id: 0, name: 'Aaron', age: 100 });

aaron.save(function (err) {
  if (err) return handleError(err);

  var story1 = new Story({
    title: "Once upon a timex.",
    _creator: aaron._id    // assign the _id from the person
  });

  story1.save(function (err) {
    if (err) return handleError(err);
    // thats it!
  });
}); 

来自官方文档 - 我的问题是,我们将story1保存到Author的位置或方式? Author之前已创建Story,因此Author不应更新story1._id ???

更新2:

我发现,如果我只使用type: Schema.Types.ObjectId而不使用type: Number,我可以这样做:

    var aaron = new Person({ _id: 0, name: 'Aaron', age: 100 });
var story1 = new Story({
    title: "Once upon a timex.",
    _creator: aaron._id    // assign the _id from the person
});
aaron.stories.push(story1._id);

aaron.save(function (err) {
  if (err) return handleError(err);
}); 
story1.save(function (err) {
    if (err) return handleError(err);
    // thats it!
}); 

这实际上是在一个虚拟的例子中...如果请求中有太多帖子ID可能丢失/重复,是否有任何问题?这种方法的缺点是什么?

1 个答案:

答案 0 :(得分:0)

  

1)我发现ref有时可能是ObjectId或只是一个数字 - 差异是什么?

请参阅此问题Why do they use an ObjectId and a Number in the Mongoose Population example?

  

我们在哪里或如何将story1保存到作者

aaron.save(function (err) {
  if (err) return handleError(err);

  var story1 = new Story({
    title: "Once upon a timex.",
    _creator: aaron._id    // assign the _id from the person
  });

  story1.save(function (err) {
    if (err) return handleError(err);
    // save id of story1 into person here, also you should use `update` operation with `$push` operator.
    aaron.stories.push(story1._id);
    aaron.save(function(err){
        if (err)
            handleError(err);
        else
            console.log('save person successfully...');
    })
  });
});

结果

> db.stories.find()
{ "_id" : ObjectId("56f72f633cf1e6f00159d5e7"), "title" : "Once upon a timex.", "_creator" : 0, "fans" : [ ], "__v" : 0 }
> db.people.find()
{ "_id" : 0, "name" : "Aaron", "age" : 100, "stories" : [ ObjectId("56f72f633cf1e6f00159d5e7") ], "__v" : 1 }