同一集合中的关系字段?

时间:2018-09-02 15:31:47

标签: mongodb keystonejs

我有一个用于产品类别(MongoDB)的keystonejs模型。一些类别应具有子类别。目前,我已经设置了一个关系字段“ ChildCategoryOf”,在这里我可以在管理面板中手动选择“父类别”。为了具有更多功能,我想创建另一个名为“ ParentCategoryOf”的字段,该字段将包含一个子类别数组。如何有一个自动在数组中存储子类别的字段?我想像这样:

enter image description here

当前型号:

let ProductCategory = new keystone.List('ProductCategory', {
    autokey: {
        from: 'name',
        path: 'key',
        unique: true
    }
});

ProductCategory.add({
    name: {
        type: String,
        required: true
    },
    ChildCategoryOf: {
        type: Types.Relationship,
        ref: 'ProductCategory',
        many: false,
        required: false,
    },
    IsParentCategory: Types.Boolean,
});

1 个答案:

答案 0 :(得分:0)

对于mongo中的类别,您可以使用类似模型的继承方式,在其中可以存储每个模型及其子级的parentId和祖先ID,然后在mongoose模型中添加方法以在每次调用它时添加一个子级一个实例,就像下面的代码:

      const ProductCategory = new Schema({
              name: String,
              parent: { type: Schema.Types.ObjectId, ref: 'ProductCategory'},
              ancestors: [{type: Schema.Types.ObjectId, ref: 'ProductCategory'}],
              children:   [{type: Schema.Types.ObjectId, ref: 'ProductCategory'}]
      });

      ProductCategory.methods = {
            addChild: function(child){
                    let that = this;
                    child.parent = this._id;
                    child.ancestors = this.ancestors.concat([this._id]);
                    return this.model('ProductCategory').create(child).addCallback 
                      (function(child){
                        that.children.push(child._id);
                        that.save();
                      });
            }
    };

然后在以后要从其类别中查找产品的位置时,应结合使用其子级ID来找到的类别ID,并在$ in运算符的find查询中使用此数组来查找其子级中的所有产品