Поле отношений в одной коллекции? - PullRequest
0 голосов
/ 02 сентября 2018

У меня есть модель keystonejs для категорий продуктов (MongoDB). Некоторые категории должны иметь подкатегории. В настоящее время я установил поле отношения "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 голосов
/ 03 сентября 2018

Для категорий в Монго вы можете использовать модель, подобную наследованию, в которой вы можете сохранить идентификатор родительского и родительского идентификатора для каждой модели и ее потомков, а затем добавить метод в модель Мангуста для добавления потомка при каждом вызове например, это будет выглядеть так:

      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();
                      });
            }
    };

затем, откуда вы хотите найти товары по их категориям, вы должны объединить найденный вами идентификатор категории с его дочерними идентификаторами и использовать этот массив в запросе поиска с оператором $ in, чтобы найти все товары в категории с ее дочерними элементами. .

...