如何在 meteor+mongo 中实现多对多集合,以便集合可搜索 and/or 可按所有可能的字段排序?
How to implement a many-to-many collection in meteor+mongo such that the collection is searchable and/or sortable by all possible fields?
我正在尝试在 meteor/mongo 中实现一个具有以下性质的集合:
FIRST_NAME-------LAST_NAME-------------CLASSES----------PROFESSORS
------------A--------------------B---------- ------------------a--------------------b
-------------------------------------------- ----------------------c--------------------d
-------------------------------------------- ----------------------e--------------------f
-------------------------------------------- ----------------------g--------------------h
------------M------------------------N----- ------------------c--------------------d
-------------------------------------------- ----------------------p--------------------q
-------------------------------------------- ----------------------x--------------------q
-------------------------------------------- ----------------------m--------------------n
-------------------------------------------- ----------------------r--------------------d
所以如上,一个人可以带多个class,一个class可以带多个人。现在,我想让这个集合可以按所有可能的字段进行搜索和排序。 (此外,一位教授可以教授多位 classes。)
在上面显示的模型中,通过 FIRST_NAME 和 LAST_NAME 搜索很容易。但是,我应该能够看到所有学生,这取决于 class 我 select。我还想查看按字母顺序排序的 classes 列表以及相应 classes 中注册的人员?
你能告诉我如何以 meteor/mongo 的方式处理这个问题吗?如果您能引导我找到与此相关的任何可用资源,我也会很高兴?
您描述的是一种更适合关系数据库的典型数据结构。不过别担心。对于大小合理的数据集,它在 MongoDB 中也非常可行。
在文档数据库中对此类结构建模时,您使用嵌入,这确实会导致数据重复,但这种数据重复通常不是问题。
您模型的伪代码:
Collection schoolClass: { // Avoid the reserved word "class"
_id: string,
name: string,
students: [ { _id: string, firstName: string, lastName: string } ],
professor: { _id: string, firstName: string, lastName: string }
}
Collection student: {
_id: string,
firstName: string,
lastName: string,
classes: [ { _id: string, name: string } ]
}
Collection professor: {
_id: string,
firstName: string,
lastName: string,
classes: [ { _id: string, name: string } ]
}
这为您提供了轻松 searchable/sortable 所有对象的入口点。如果您需要某个对象的一些特殊数据,您只需跟随 "relation" _id
到下一个集合。公共查询中所有文档所需的所有数据都应存在于查询 运行 上的集合中。
您只需要确保在对象更改时更新所有相关集合。
好的读物是https://docs.mongodb.com/manual/core/data-modeling-introduction/
我正在尝试在 meteor/mongo 中实现一个具有以下性质的集合:
FIRST_NAME-------LAST_NAME-------------CLASSES----------PROFESSORS
------------A--------------------B---------- ------------------a--------------------b
-------------------------------------------- ----------------------c--------------------d
-------------------------------------------- ----------------------e--------------------f
-------------------------------------------- ----------------------g--------------------h
------------M------------------------N----- ------------------c--------------------d
-------------------------------------------- ----------------------p--------------------q
-------------------------------------------- ----------------------x--------------------q
-------------------------------------------- ----------------------m--------------------n
-------------------------------------------- ----------------------r--------------------d
所以如上,一个人可以带多个class,一个class可以带多个人。现在,我想让这个集合可以按所有可能的字段进行搜索和排序。 (此外,一位教授可以教授多位 classes。)
在上面显示的模型中,通过 FIRST_NAME 和 LAST_NAME 搜索很容易。但是,我应该能够看到所有学生,这取决于 class 我 select。我还想查看按字母顺序排序的 classes 列表以及相应 classes 中注册的人员?
你能告诉我如何以 meteor/mongo 的方式处理这个问题吗?如果您能引导我找到与此相关的任何可用资源,我也会很高兴?
您描述的是一种更适合关系数据库的典型数据结构。不过别担心。对于大小合理的数据集,它在 MongoDB 中也非常可行。
在文档数据库中对此类结构建模时,您使用嵌入,这确实会导致数据重复,但这种数据重复通常不是问题。
您模型的伪代码:
Collection schoolClass: { // Avoid the reserved word "class"
_id: string,
name: string,
students: [ { _id: string, firstName: string, lastName: string } ],
professor: { _id: string, firstName: string, lastName: string }
}
Collection student: {
_id: string,
firstName: string,
lastName: string,
classes: [ { _id: string, name: string } ]
}
Collection professor: {
_id: string,
firstName: string,
lastName: string,
classes: [ { _id: string, name: string } ]
}
这为您提供了轻松 searchable/sortable 所有对象的入口点。如果您需要某个对象的一些特殊数据,您只需跟随 "relation" _id
到下一个集合。公共查询中所有文档所需的所有数据都应存在于查询 运行 上的集合中。
您只需要确保在对象更改时更新所有相关集合。
好的读物是https://docs.mongodb.com/manual/core/data-modeling-introduction/