我看到我们使用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 }
问题
__t: 'User'
来自哪里?你有
每位医生可能会有1000名医生和许多患者。并且信息将与他们的实践有关(就像他们有多少员工)。所以我觉得应该有一种分离的关注。(一个原因是为了防止患者单个文件变大)。所以如果我们使用populate方法如果你可以解释如何为这种情况设置它。我想我可以有一名医生作为父母,一名儿童为患者服务,另一名儿童则提供有关练习的信息。所以也许应该有一个对象的objectId数组和一个其他信息的数组
答案 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的设计使查询更有效率。所以我们的架构应该符合它。