Mongo-DB不支持在嵌套结构中使用通配符进行查询。
在如下所示的数据结构中:
Courses = [{
'name': 'Learning node.js in 1 day',
'roles': {
'team': { subscribed: [ 'User1' ] },
'participant': { subscribed: [ 'User1', 'User2' ] },
'host': { optional: true, subscribed: [] }
}
}]
我们需要使用通配符查找来查找不同角色的订阅者,以便不使用这样的查询:
{ $or : [
{"roles.team.subscribed": 'User1'},
{"roles.participant.subscribed": 'User1'}
{"roles.host.subscribed": 'User1'}
]}
无论如何,如果我们有一个公开的角色列表,这不起作用。
如果我们把它改成这样的话:
'roles': ['team', 'participant', 'host'],
'subscribed': [
{'user':'User1', 'roles': ['team', 'participant']},
{'user':'User2', 'roles': ['participant']}
]
然后找到课程的所有参与者同样很困难。无论哪种方式,我们都有问题找到用户订阅的所有课程。
我们考虑为订阅创建一个单独的集合(回到关系):
{user_id: 'User1', course_id: '456', role: 'participant'}
{user_id: 'User1', course_id: '456', role: 'team'}
{user_id: 'User2', course_id: '456', role: 'participant'}
什么是最佳做法? 我们希望能够进行所有不同类型的查询,如果它被嵌入嵌套结构中似乎很难... 认为这是mongoDB中数据结构的基本问题。
答案 0 :(得分:0)
如果你不想改变你的结构,我想我会用聚合框架做这样的事情。如果你的角色里面的字段不是很多而且用户不能完全管理,那么在这种情况下,我建议你在角色中使用一个数组并展开它。 让我们采取你的第一个结构:
Courses = [{
'name': 'Learning node.js in 1 day',
'roles': {
'team': { subscribed: [ 'User1' ] },
'participant': { subscribed: [ 'User1', 'User2' ] },
'host': { optional: true, subscribed: [] }
}
}]
以这种方式的项目字段:
name,roles.team,roles.participant,roles.host
所以你最终会得到这个结构
Courses = [{
'name': 'Learning node.js in 1 day',
'roles.team.subscribed': [ 'User1' ] ,
'roles.participant.subscribed': [ 'User1', 'User2' ] ,
'roles.host.subscribed': subscribed: []
}
}]
然后你可以解开订阅的字段并通过订阅获得笛卡尔产品,你需要放松3次:
Courses = [
{
'name': 'Learning node.js in 1 day',
'roles.team.subscribed.values': 'User1' ,
'roles.participant.subscribed.values': 'User1',
'roles.host.subscribed.values': ''
}
},
{
'name': 'Learning node.js in 1 day',
'roles.team.subscribed.values': 'User1' ,
'roles.participant.subscribed.values': 'User2',
'roles.host.subscribed.values': ''
}
}
最后,您可以单独匹配每个角色。
当然你需要使用聚合框架,需要时间来使用它。