试图了解populate方法的用法

时间:2016-01-25 22:44:35

标签: javascript mongoose mongoose-populate database

我看到我们使用populate的一种方法是将另一个集合中的一个文档放入“父”集合中。我刚刚经过this问题,我希望有人可以更好地向我解释答案。并告诉我一个实际用途。以下是答案中的一个例子。

var PersonSchema = new mongoose.Schema({
    t: String
}, {collection: 'persons'});

var User = mongoose.model('User', PersonSchema.extend({
  _id: String,
  name: String
}));

var ParentSchema = new mongoose.Schema({
    s: String
}, {collection: 'parent'});

var Like = mongoose.model('Like', ParentSchema.extend({
  _id: String,
  user_id: {
    type: String,
    ref: 'User'
  }
}));

将数据插入数据库,

var user = new User({
    t: 't1',
    _id: '1234567',
    name: 'test'
});

var like = new Like({
    s: 's1',
    _id: '23456789',
});

user.save(function(err, u){
    if(err)
        console.log(err);
    else {
        like.user_id = u._id;
        console.log(like);
        like.save(function(err) {
            if (err)
                console.log(err);
            else
                console.log('save like and user....');
        });
    }
});

查询
Like.findOne({}).populate('user_id').exec(function(err, doc) {
    if (err)
        console.log(err);
    else
        console.log(doc);
});

结果是

{ _id: '23456789',
  __t: 'Like',
  user_id: { _id: '1234567', __t: 'User', t: 't1', name: 'test', __v: 0 },
  s: 's1',
  __v: 0 }

问题

  1. __t: 'User'来自哪里?
  2. 我在想使用populate()或ref来分隔集合,但最后看起来像like集合中有用户文档。我想我想使用populate所以我可以缩小文档。 3.如果有人真的想帮我向我解释一下,我有一个例子,我一直试图做,我不知道我是否应该使用填充,但如果我应该如果你告诉我怎么样会很好。这是一个例子。
  3. 你有

    1. 医生
    2. 患者
    3. 有关练习的信息
    4. 每位医生可能会有1000名医生和许多患者。并且信息将与他们的实践有关(就像他们有多少员工)。所以我觉得应该有一种分离的关注。(一个原因是为了防止患者单个文件变大)。所以如果我们使用populate方法如果你可以解释如何为这种情况设置它。我想我可以有一名医生作为父母,一名儿童为患者服务,另一名儿童则提供有关练习的信息。所以也许应该有一个对象的objectId数组和一个其他信息的数组

1 个答案:

答案 0 :(得分:0)

  

Q1:__t在哪里:'用户'来自?

请参阅此link

  

mongoose现在包括破坏mongoose-schema-extend的模式继承和discriminatorKey功能。 mongoose现在默认将discriminatorKey模式选项设置为__t

  

Q2:我在考虑使用populate()或ref来分隔集合,但最后看起来像like集合中有用户文档。我想我想使用populate,所以我可以缩小文档。

你似乎误解了Population的含义。 MongoDB中没有连接,但有时我们仍然希望引用其他集合中的文档。这是人口进入的地方。人口是自动用其他集合中的文档替换文档中的指定路径的过程。因此populate不用于使文档变小。

  

问题3:医生,患者,实践

架构可能如下:

var DoctorSchema = new Schema ({
   name: String,
   // ... other field
});

var PatientSchema = new Schema ({
  name: String,
  doctor: {type: Schema.ObjectId,
          ref: 'Doctor'}
});

var PracticeSchema = new Schema ({
  ff: String,
  patientId: {type: Schema.ObjectId,
             ref: 'Patient'},
  doctorId: {type: Schema.ObjectId,
             ref: 'Doctor'}
});

对于模式,很难确定哪种模式更好((填充或不填充)。我们应该考虑的第一件事是满足我们的查询要求,以使查询容易。 mongoDB的设计使查询更有效率。所以我们的架构应该符合它。