我有一个方向图,可以将人与人,人与孩子以及人与宠物联系起来。关系模型如下所示:
module.exports = mongoose.model('Relationship', {
sourcePerson: {type: Schema.Types.ObjectId, ref: 'Person'},
targetPerson: {type: Schema.Types.ObjectId, ref: 'Person'},
targetChild: {type: Schema.Types.ObjectId, ref: 'Child'},
targetPet: {type: Schema.Types.ObjectId, ref: 'Pet'},
relationshipStatus: {
type: String,
enum: enums.relationshipStatus
}
});
我不的主要原因是人们通过数组使用子文档是因为这类数据模型的维护太高而且太严格。我知道这些陈述有点对比。
你知道,如果一对夫妻结婚,那么在添加关系时会做出假设,而逻辑模型会变得更加严格,但如果他们不是,那么关系就非常宽松,必须用于用例。
所以,让我们考虑3个人:
_id firstName lastName
1 Bob Smith
2 Jane Smith
3 Billy Bob
和他们的关系:
sourcePerson targetPerson relationshipStatus
1 2 M
2 1 M
请注意3
,Billy Bob
与任何人都没有关系。
现在,我有一个问题,我建立了为人们投射个人资料的建筑。具体来说,他们是否结婚,是否有宠物,他们是否有孩子。
到目前为止,我构建了以下aggregate
:
db.people.aggregate([
{
$match: {
'_id': {
$in: db.relationships.distinct('sourcePerson', {
relationshipStatus: {
$eq: 'M'
}
})
}
}
},
{
$project: {
firstName: 1,
lastName: 1,
profile: {
married: {
$literal: true
}
}
}
},
{
$match: {
'_id': {
$in: db.relationships.distinct('sourcePerson', {
targetPet: {
$ne: null
}
})
}
}
},
{
$project: {
firstName: 1,
lastName: 1,
profile: {
married: 1,
pets: {
$literal: true
}
}
}
},
{
$match: {
'_id': {
$in: db.relationships.distinct('sourcePerson', {
targetChild: {
$ne: null
}
})
}
}
},
{
$project: {
firstName: 1,
lastName: 1,
profile: {
married: 1,
pets: 1,
children: {
$literal: true
}
}
}
}
])
我遇到的直接问题是如何使用我将要调用的当前预测$nin
_id
Person
db.people.aggregate([
{
$match: {
'_id': {
$in: db.relationships.distinct('sourcePerson', {
relationshipStatus: {
$eq: 'M'
}
})
}
}
},
{
$project: {
firstName: 1,
lastName: 1,
profile: {
married: {
$literal: true
}
}
}
}
...
])
"
具体我的意思是这个。如果我们采用这个片段:
$nin
此时我预测了所有已婚人士#34;。仅从这个预测中我就可以识别出那些未婚的人#34;如果我能scope
目前的预测。
我不确定这是否是我想要的。 如果有更好的整体方式,我就完全开放了。
期待您的反馈!