Mongoose: Как найти по 2 полям, где одно поле существует в документе, а другое в поддокументах? - PullRequest
0 голосов
/ 06 июля 2018

Ниже моя схема.

var prayerSchema = new Schema({
    totalSteps:{
      type: Number
    },
    name: String,
    steps: [{type: Schema.Types.ObjectId, ref:'Step'}]
});


var stepSchema = new Schema({
    stepNumber : {
       type: Number
    },
    _prayer : {
         type: Schema.Types.ObjectId, ref: 'Prayer', required: true
    } 
 });

Каждая молитва будет иметь общие шаги, имя и шаги.
С каждым шагом будет связано stepNumber и молитвенная модель.
Шаг документ будет выглядеть так:

{
   "stepNumber":1,
   _prayer:[
       "name":"prayer1",
       "totalSteps":5,
       "steps":[]
    ] 
 },
 {
    "stepNumber":2,
    _prayer:[
        "name":"prayer2",
        "totalSteps":10,
        "steps":[]
     ]   
  }

Я пытаюсь выполнить запрос по имени, существующему в поддокументе (_prayer) stepSchema и stepNumber из stepSchema.

Step.find({_prayer :{ name: req.query.name} }, {stepNumber: 1});
Step.find({'_prayer.name' : req.query.name, stepNumber: 1});

Оба приведенных выше кода не работают. Один из найденных способов - сначала запросить документ Молитва по его имени, получить его _id и снова запросить Шаг документ по найденным _id и stepNumber.

Prayer.findOne({name:"name"})
   .exec((err, prayers) => {

    Rakah.find({ _prayer: prayers._id, stepNumber: stepNumber })

    ....
});

Но такой подход станет сложным для вложенных документов. Есть ли способы сделать запрос по одному документу только для получения результата?

1 Ответ

0 голосов
/ 06 июля 2018

Оба условия фильтрации должны быть включены в один объект find следующим образом:

Step.find({'_prayer.name' : req.query.name, stepNumber: 1 })

Второй параметр представляет часть проекции, поэтому вы просто получаете только _id и stepNumber (1 означает, что поле должно быть включено в результаты)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...