Node.js - Как применить фильтр и текстовый поиск к заполненным полям в MongoDB? - PullRequest
0 голосов
/ 07 февраля 2020
const parentSchema = new Schema({
  name: {
    type: String,
    required: true
  },
  childId: {
    type: Schema.Types.ObjectId,
    ref: "Child"
  }
});

const childSchema = new Schema({
  name: {
    type: String,
    required: true
  },
  email: {
    type: String,
    required: true
  }
});

const results = await Parent.find().populate("clientId", "email, name");
  1. Как применить фильтр к «электронной почте», чтобы заполнить определенный ребенок с данным «электронным письмом»?
  2. Как применить текстовый поиск к «имени» ребенка?

1 Ответ

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

Для этого вам нужно будет использовать aggregate, см. Код ниже

Parent.aggregate([
    {
        $lookup: {
            from: 'child',
            let: {
                email_: "abc@example.com",
                childId_: '$childId'
            },
            pipeline: [
                {
                    $match: {
                        $expr: {
                            $and: [
                                {
                                    $eq: ['$email', '$$email_']
                                },
                                {
                                    $eq: ['$_id', '$$childId_']
                                }
                            ]
                        }
                    }
                }
            ],
            as: 'child'
        }
    },{
        $unwind:'$child'
    },{
        $match:{
            'child.name':{
                $regex: "SearchKeyWord",
                $options: 'i' // For case insensitive search
            }
        }
    }
]);

Здесь мы сначала заполняем только child, указав email_id, используя $lookup

Затем мы используем регулярное выражение для фильтрации child на основе поискового ключевого слова (я использовал регистр без учета регистра)

Теперь это даст вам список всех детей с соответствующими родителями, например [{parent_field_1:parent_value_1,......, child:{child_object}}]

Если вы хотите, чтобы все дети были от одних и тех же родителей, вы можете использовать $group в своем последующем прогнозе

...