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

Mongo-DB不支持在嵌套结构中使用通配符进行查询。

在一个像这样的数据结构中:

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

我们需要通配符查找来查找不同angular色的订阅者,以便不使用这样的查询:

 { $or : [ {"roles.team.subscribed": 'User1'}, {"roles.participant.subscribed": 'User1'} {"roles.host.subscribed": 'User1'} ]} 

无论如何,这是行不通的,如果我们有一个开放的angular色列表。

如果我们把它改成这样的话:

 'roles': ['team', 'participant', 'host'], 'subscribed': [ {'user':'User1', 'roles': ['team', 'participant']}, {'user':'User2', 'roles': ['participant']} ] 

同样难以find一个课程的所有参与者。 无论哪种方式,我们有一个问题,find用户订阅的所有课程。

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

 {user_id: 'User1', course_id: '456', role: 'participant'} {user_id: 'User1', course_id: '456', role: 'team'} {user_id: 'User2', course_id: '456', role: 'participant'} 

什么是最佳做法? 我们希望能够做出各种各样的查询,如果它被embedded到一个嵌套的结构中似乎很困难。想想这是mongoDB中数据结构的一个基本问题。

如果你不想改变你的结构,我想我会做这样的事情使用聚合框架。 如果你的angular色内的字段不是很多,而且用户不能完全pipe理的话,那么我build议你在angular色中使用一个数组并将其展开。 让我们来看看你的第一个结构:

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

项目领域这样:

名字,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': '' } } 

]

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

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