Как реализовать внутреннее соединение в мангусте - PullRequest
0 голосов
/ 06 февраля 2020

Проблема: я хочу добиться внутреннего соединения в пн goose для модели, которая имеет динамический c ref и прямой ref для другой модели (моделей). Просьба ссылаться на образец схемы и модели ниже.

const schema1 = mongoose.schema({
   on: {
      type: Schema.Types.ObjectId,
      required: true,
      refPath: 'onModel'
   },
   onModel: {
      type: String,
      required: true,
      enum: ['Model2', 'Model3']
   },
   company: {
      type: Schema.Types.ObjectId,
      ref: 'Company'
   }
});

const Model1 = mongoose.model('Model1', schema1);


const schema2 = mongoose.schema({
   name: {
      type: String,
      maxlength: 100
   },
   email: {
      type: String,
      maxlength: 100
   }
});
const Model2 = mongoose.model('Model2', schema2);

const schema3 = mongoose.schema({
   name: {
      type: String,
      maxlength: 100
   },
   email: {
      type: String,
      maxlength: 100
   }
});
const Model3 = mongoose.model('Model3', schema3);

const companySchema = mongoose.schema({
   companyName: {
     type: String,
     maxlength: 100
   }
});
const company = mongoose.model('Company', companySchema);

const res = await models.Model1
            .find()
            .populate({
              path: 'on',
              match: {
                'name': keyword
              }
             })
            .populate({
              path: 'company',
              match: {
               'companyName': keyword
              }
            });

Приведенный выше поиск возвращает документы, даже если он включен, а компания возвращает нулевое значение (так как mon goose заполняет реализации по умолчанию, оставляя соединение).

Ожидаемый результат: Я хочу получить документы из model1, только если оно соответствует ключевому слову с полем имени в model2 или model3 или с полем названия компании в модели компании.

Как этого добиться? Ваша помощь очень ценится.

1 Ответ

0 голосов
/ 06 февраля 2020

1. Давайте обновим схему для «Модели 1», как показано ниже: -

    const schema1=mongoose.schema( {
        ref: {
            kind: String, // <-- This will store the Model Name (Model2 or Model3) when you execute the insert query.
            item: {
                type: mongoose.Schema.Types.ObjectId, // <-- This will store the Reference ID of another table (Model2 OR Model3)
                refPath: 'ref.kind', fields: String,
            }
            ,
        }
        , company: {
            type: Schema.Types.ObjectId, ref: 'Company'
        }
    });

Сохранить схему для Model2, Model3 & Company как есть. Здесь нет необходимости вносить какие-либо изменения.

Когда вы хотите найти: -

await models.Model1.find().populate({ path: 'ref.item' });

Вот и все. Это должно работать.

...