как работать с $ lookup и $ regex search в mongodb - PullRequest
0 голосов
/ 20 февраля 2020
  var query = req.params.query;

    const messages = await Message.aggregate([
      {
        $lookup: {
          from: 'users',
          localField: 'reference_id',
          foreignField: '_id',
          as: 'users'
        }
      },
      {'text': {'$regex': `.*${query}.*`}}
    ])

$ lookup предоставляет мне правильную информацию, но $ regex не работает должным образом Когда add {'text': {'$ regex': .*${query}.*}} говорит мне, что аргументы должны быть агрегатными операторами конвейера после $ lookup i иметь данные

{
    "response": {
        "messages": [
            {
                "_id": "5e4a8e640b92852e110af62f",
                "text": "Gsshha",
                "reference_id": null,
                "date": 1581944420262,
                "users": [
                    {
                        "_id": "5e4a8d2d3952132a08ae5764",
                        "phone": "1111111111",
                        "first_name": "Test1",
                        "last_name": "Test1",
                        "timestamp": 1581944109860
                    }
                ]
            },
            {
                "_id": "5e4ce3a4f55dd93292cbe149",
                "unreads": [
                "text": "Hi",
                "reference_id": null,
                "date": 1582097316013,
                "users": [
                    {
                        "_id": "5e4a8d2d3952132a08ae5764",
                        "phone": "1111111111",
                        "first_name": "Test1",
                        "last_name": "Test1",
                        "timestamp": 1581944109860
                    }
                ]
            }
        ]
    }
}

Что я хочу достичь, получить все значения из $lookup и строку поиска из text field, first_name field и last_name поле, как этого добиться

1 Ответ

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

У вас есть синтаксическая ошибка в запросе. Попробуйте, как указано ниже:

var query = req.params.query;

const messages = await Message.aggregate([
    {
        $lookup: {
            from: 'users',
            localField: 'reference_id',
            foreignField: '_id',
            as: 'users'
        }
    }, { $match: { 'text': { '$regex': `.*${query}.*` } } }
])

Таким образом, проблема возникает, когда вы получаете эту ошибку: Аргументы должны быть агрегированными операторами конвейера , As Вы можете видеть, что в агрегации есть определенные этапы или операторы, такие как Пример: - $lookup, $match, $project et c .. поэтому, если агрегат найдет что-то другое, он выдаст ошибку. Поскольку вам нужно отфильтровать данные, вам нужно обернуть фрагмент кода 'text': { '$regex':. $ {query}. } in $match.

Ref: Агрегационный трубопровод

...