推荐的数据结构(不查询node.js中的嵌套数据)

时间:2013-12-05 20:19:21

标签: node.js mongodb database

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中数据结构的基本问题。

1 个答案:

答案 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': '' 
    }
}

最后,您可以单独匹配每个角色。

当然你需要使用聚合框架,需要时间来使用它。