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

标签 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']} 
]

然后找到类(class)的所有参与者同样困难。无论哪种方式,我们都很难找到用户订阅的所有类(class)。

我们考虑为订阅创建一个单独的集合(回到关系):

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

最佳答案

如果您不想更改结构,我想我会使用聚合框架来做类似的事情。如果您的角色中的字段不是很多并且用户不能完全管理,在这种情况下,我建议您在角色中使用数组并将其展开。 让我们来看看你的第一个结构:

Courses = [{
    'name': 'Learning node.js in 1 day',
    'roles': {
        'team':        { subscribed: [ 'User1' ] },
        'participant': { subscribed: [ 'User1', 'User2' ] },
        'host':        { optional: true, subscribed: [] }
    }
}]

以这种方式项目领域:

姓名、角色.团队、角色.参与者、角色.主持人

所以你最终会得到这个结构

Courses = [{
    'name': 'Learning node.js in 1 day',
    'roles.team.subscribed': [ 'User1' ] ,
    'roles.participant.subscribed': [ 'User1', 'User2' ] ,
    'roles.host.subscribed': subscribed: [] 
    }
}]

然后你可以unwind subscribed field并得到一个订阅的笛卡尔积,你需要unwind 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': '' 
    }
}

]

最后你可以分别匹配每个角色。

当然要用到聚合框架,需要时间去适应。

关于node.js - 推荐的数据结构(不查询 node.js 中的嵌套数据),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20409838/

相关文章:

node.js - 如何通过 Express.js 中的请求传递响应?

node.js - 如何从现有模型创建新的 Sails 模型

node.js 和 npm 在 windows 7 64 位终极版中没有网络访问权限

node.js/express/mongoose 菜鸟问题

javascript - 无法使用 Express NodeJS 和 MongoDB 从 API 检索数据,正在加载

node.js - 在 Express/Node 中通过 https 强制请求

用于保留、嵌套或引用的 MongoDB 模式?

SQL 效率行或表

swift - 通过 UISearchBar 使用 CoreData 过滤查询

java - jtable中的数据库