Javascript 试图理解populate方法的用法

Javascript 试图理解populate方法的用法,javascript,mongoose,mongoose-populate,database,Javascript,Mongoose,Mongoose Populate,Database,我看到我们使用的一种方法是将另一个集合中的一个文档放入“父”集合。我只是想问一下这个问题,我希望有人能更好地向我解释答案。让我看看它的实际用途。下面是答案中的一个例子 var PersonSchema = new mongoose.Schema({ t: String }, {collection: 'persons'}); var User = mongoose.model('User', PersonSchema.extend({ _id: String, name: St

我看到我们使用的一种方法是将另一个集合中的一个文档放入“父”集合。我只是想问一下这个问题,我希望有人能更好地向我解释答案。让我看看它的实际用途。下面是答案中的一个例子

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 }
问题:

  • \u\t:“用户”
    来自哪里
  • 我想使用populate()或ref来分隔集合,但看起来最后like集合中包含了users文档。我想我想使用populate,这样我可以使文档更小。 3.另外,如果有人真的想帮我解释这一点,我有一个我一直在尝试的例子,我不知道我是否应该使用populate,但如果我应该使用populate,如果你告诉我如何使用,那就太好了。这是一个例子
  • 你有

  • 医生
  • 病人
  • 有关该做法的资料
  • 可能有1000名医生,每个医生都有很多病人。信息将是关于他们的实践(比如他们有多少员工)。因此,我觉得应该将关注点分开(一个原因是防止患者的单个文档变得庞大)。因此,如果我们使用填充方法,如果您可以解释如何为这种情况设置它。我想我可以有一个医生作为父母,一个孩子为病人做参考,另一个孩子为实践的信息做参考。因此,可能应该有一个用于患者的objectId数组和一个用于其他信息的数组

    问题1:“用户”来自哪里

    参考这个

    mongoose现在包括模式继承和discriminatorKey功能,这些功能打破了mongoose模式扩展。mongoose现在将discriminatorKey模式选项默认设置为
    \u t


    问题2:我想使用populate()或ref来分隔集合,但看起来最后like集合中包含了users文档。我想我想使用populate,这样我可以使文档更小

    看来你误解了这个词的意思。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的设计使得查询更加高效。因此,我们的模式应该满足要求。

    因此,populate可以帮助从其他集合中获取文档。我曾经有一个医生集合,其中包含一长串涉及数据的患者列表,我决定看看是否有办法或是否值得将他们分开。我来看看填充可能有助于分离lil,但我不认为它有助于收集允许的最大数据量,因为填充将所有文档放在一起,所以我认为填充对我来说没有用处。如果我想获得我认为在过去不需要的其他收藏,也许它会很有用。“你怎么看?”杰克布兰克,你说得对。如果医生里有很多病人,那么这个选择似乎不适合你。正如我们所知,mongodb中的populatejustreplace
    join
    操作有点像。也可以在填充操作中应用一些查询条件来查找我们感兴趣的ref文档。同样对于mongo模式,很难说哪个模式更好。首先,我们设计的模式必须满足我们的要求,以提高查询效率。这很重要。。。