我正在使用 Mongoose 3.x 实现一个树结构(类似于 Mongo 文档中的这个),但我不确定封装所有逻辑的最佳方法,以加载特定节点及其兄弟节点和祖先节点,特别是在 ref 与 ref-er 位于同一集合中的情况下,如何最好地使用填充功能。
在某些情况下,我正在使用的树是未编辑节点但可能随时将新子节点添加到任何节点的树。到目前为止,我已经使用一组模型方法正常工作,这些方法在初始查找后加载对象,但似乎应该有更好的方法来轻松加载单个分支,其中包含我需要的所有父级和兄弟级数据控制器中的命令,并将所有相关人口封装在模型上的一些方便的查找方法中。
那么,我尝试使用的基本架构可能是这样的(也可以在此处获得:https ://gist.github.com/3889616 ):
// Sub-document to store parent ref along with it's value (a form of caching)
var Parent = new Schema({
id: ObjectId
, text: String
});
// Main tree-node element schema
var Branch = new Schema({
text: {
type: String
, required: true }
, date: {type: Date, default: Date.now }
, trail: [Parent]
, parentBranchId: ObjectId
, parentBranch: { type: Schema.Types.ObjectId, ref: 'Branch' }
, _children: [{type: Schema.Types.ObjectId, ref: 'Branch'}]
// These two have been commented out because I have no clue how to best implement
// , _priorSiblings: { type: Schema.Types.ObjectId, ref: 'Branch' }
// , _followingSiblings: { type: Schema.Types.ObjectId, ref: 'Branch' }
});
然后,我希望能够通过类似以下代码的方式加载带有相关相关数据的分支,尽管此时我几乎迷路了,并且可能是一个很好的基础:
req.app.models.Branch
.findById(req.param("id"))
.populate("parentBranch")
.populate("parentBranch._children")
.exec(...)
最终,我很想有一些我可以抽象成 Mongoose 的“树”插件的东西,但我认为我必须首先正确地构建这个架构。有任何想法吗?
FWIW,归根结底,我真正需要的每个分支的数据是父级、下一个兄弟级、前一个兄弟级(都在创建时间方面)和父级的所有子级。
提前致谢!