【问题标题】:Trying to understand the use of the populate method试图理解填充方法的使用
【发布时间】:2016-05-02 10:17:42
【问题描述】:

我看到我们使用填充的一种方法是将另一个集合中的一个文档放入“父”集合中。我刚刚经历了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 集合包含用户文档。我想我想使用填充,所以我可以使文档更小。 3.此外,如果有人真的想帮助向我解释这一点,我有一个我一直在尝试做的例子,我不知道我是否应该使用填充,但如果我应该使用的话,如果你告诉我怎么做会很棒。这是示例。

你有

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

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

【问题讨论】:

    标签: javascript mongoose mongoose-populate database


    【解决方案1】:

    Q1:__t: 'User' 来自哪里?

    请参阅此link

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


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

    您似乎误解了Population 的含义。 MongoDB 中没有连接,但有时我们仍然希望引用其他集合中的文档。这就是人口的来源。人口是自动将文档中的指定路径替换为来自其他集合的文档的过程。所以populate不是用来缩小文档的。


    Q3:医生、患者、实践

    架构可能如下:

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

    【讨论】:

    • 所以填充可以帮助从其他集合中获取文档。我曾经有一个医生集合,其中包含一长串涉及数据的患者,我决定看看是否有办法或者是否值得将它们分开。我来看看填充可能有助于分离 lil 但我认为它不会有助于收集允许的最大数据,因为填充将所有文档放在一起所以我认为填充不会有用或我。如果我想访问我认为过去不需要的其他集合,也许它会很有用。你怎么看?
    • @jackblank,你是对的。如果医生中有很多患者,那么填充似乎不适合您。正如我们所知,填充只是替换 mongodb 中的 join 操作,有点。也可以在填充操作中应用一些查询条件来查找我们感兴趣的一些参考文档。
    • @jackblank。同样对于 mongo 模式,很难说哪种模式更好。首先,我们设计的模式必须满足我们的要求,以使查询更高效。这很重要……
    猜你喜欢
    • 2020-06-07
    • 2014-01-02
    • 1970-01-01
    • 1970-01-01
    • 2016-08-09
    • 2020-07-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多