试图了解 populate 方法的使用

Trying to understand the use of the populate method

我看到我们使用填充的一种方法是将另一个集合中的一个文档放入 "parent" 集合中。我刚刚在回答 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.Also 如果有人真的想帮我解释一下,我有一个我一直在尝试做的例子,我不知道我是否应该使用 populate,但如果我应该,如果你告诉我如何做,那就太好了.这是例子。

你有

  1. 医生
  2. 患者
  3. 有关实践的信息

可能有 1000 名医生,每个医生对应很多病人。这些信息将是关于他们的做法(比如他们有多少员工)。所以我觉得应该有一个关注点分离。(一个原因是为了防止一个病人的单个文档变大)。因此,如果我们要使用填充方法 如果您可以解释如何针对这种情况进行设置。我想我可以让医生作为患者的 parent 和 child 参考,以及关于实践信息的另一个 child 参考。所以也许应该有一个用于患者的 objectId 数组和一个用于其他信息的数组

Q1: where does __t: 'User' come from?

参考这个link.

mongoose now includes schema inheritance and discriminatorKey functionality that breaks mongoose-schema-extend. mongoose now sets the discriminatorKey schema option to __t by default


Q2: I was thinking that using populate() or ref that would separate the collections but it looks like at the end the like collection has the users document in it. I think I wanted to use populate so I could make a document smaller.

看来你误解了Population的意思。 MongoDB 中没有连接,但有时我们仍然希望引用其他集合中的文档。这就是填充的来源。填充是用其他集合中的文档自动替换文档中指定路径的过程。所以populate不是用来缩小文档的。


Q3: Doctor, Patient, Practice

架构如下:

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的设计让查询更高效。所以我们的架构应该满足它。