Mongoose: используйте $ или в .populate ({match}) - PullRequest
0 голосов
/ 13 октября 2019

Я настроил базу данных следующим образом:


const listSchema = new mongoose.Schema({
    name: {
        type: String,
        required: true,
        trim: true
    },
    additionalInfo: {
      type: String,
      required: false
    },
    author: {
        required: true,
        type: mongoose.Schema.Types.ObjectId,
        ref: 'User'
    }
  })

  listSchema.virtual('vocs', {
    ref: 'Voc',
    localField: '_id',
    foreignField: 'list'
  })

  var List = mongoose.model('List', listSchema);

  module.exports = List;


const vocSchema = new mongoose.Schema({
    foreignLanguage: {
        type: String,
        required: true,
        trim: true
    },
    translationGerman: {
      type: String,
      required: true,
      trim: true
    },
    translationForeignLanguage: {
        type: String,
        required: true
    },
    difficulty: {
        type: Number,
        required: true
    },
    list: {
        required: true,
        type: mongoose.Schema.Types.ObjectId,
        ref: 'List'
    }
  })

  var Voc = mongoose.model('Voc', vocSchema);

  module.exports = Voc;

Теперь я хочу сделать следующее: я хочу выбрать все списки с определенным автором, затемдотянуться до вокала и отфильтровать эти вокалы с помощью translationGerman и translationForeignLanguage: я хочу выбрать все воки по всем спискам, которые имеют определенное значение (скажем, слово «яблоко» в «translationGerman» или «translationForeignLanguage»). Я пробовалследующий код:

router.get('/api/filterAllWords/:wordname', auth, async (req, res) => {
    try {

        // const words = await Voc.find({$or:[{translationForeignLanguage: req.params.wordname},{translationGerman: req.params.wordname}]});
        // console.log(words);
        // res.send(words)

        const lists = await List.find({author: req.user._id});
        let allVocs = [];

        for (let i = 0; i < lists.length; i++) {
            const singleListVocs = await lists[i].populate(
                {path: "vocs",
                match: {
                    {$or:[{translationForeignLanguage: req.params.wordname},{translationGerman: req.params.wordname}]}
                }}).execPopulate();
            for(let i = 0; i < singleListVocs.vocs.length; i++) {
                allVocs.push(singleListVocs.vocs[i])
            }
        }

        res.send(allVocs)
    }

    catch {
        res.status(404).send({status: 'No vocs found'});
    }
})

Когда я пытаюсь проверить код, он выдает мне сообщение «Неожиданный токен». Я неправильно использую $ или внутреннее заполнение (совпадение). Когда я пытаюсь повторить этокод просто "translationForeignLanguage: req.params.wordname" как match-Parameter, все в порядке и отлично работает!

Спасибо за вашу помощь!

Юлия

1 Ответ

0 голосов
/ 14 октября 2019

Просто потеряйте лишние фигурные скобки, которые есть в match (вокруг оператора $or), и оно должно работать:

lists[i]
  .populate({
    path: 'vocs',
    match: {
      $or: [
        { translationForeignLanguage: req.params.wordname },
        { translationGerman: req.params.wordname },
      ],
    },
  })
  .execPopulate();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...