试图了解 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 }
问题
__t: 'User'
从何而来?
- 我在考虑使用 populate() 或 ref 来分隔集合,但看起来最后 like 集合中包含用户文档。我想我想使用 populate 来缩小文档。
3.Also 如果有人真的想帮我解释一下,我有一个我一直在尝试做的例子,我不知道我是否应该使用 populate,但如果我应该,如果你告诉我如何做,那就太好了.这是例子。
你有
- 医生
- 患者
- 有关实践的信息
可能有 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的设计让查询更高效。所以我们的架构应该满足它。
我看到我们使用填充的一种方法是将另一个集合中的一个文档放入 "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 }
问题
__t: 'User'
从何而来?- 我在考虑使用 populate() 或 ref 来分隔集合,但看起来最后 like 集合中包含用户文档。我想我想使用 populate 来缩小文档。 3.Also 如果有人真的想帮我解释一下,我有一个我一直在尝试做的例子,我不知道我是否应该使用 populate,但如果我应该,如果你告诉我如何做,那就太好了.这是例子。
你有
- 医生
- 患者
- 有关实践的信息
可能有 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的设计让查询更高效。所以我们的架构应该满足它。