Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 18.09.2019, 07:50
Интересующийся
Отправить личное сообщение для darktowerk56c Посмотреть профиль Найти все сообщения от darktowerk56c
 
Регистрация: 08.03.2019
Сообщений: 17

Как правильно отфильтровать данные в MongoDB?
Всем привет, подскажите, пожалуйста, как правильно сделать следующую фильтрацию в MongoDB?
У меня есть три документа.
{
    "_id": {
        "$oid": "5d7f70d46b647c1a74d9b8aa"
    },
    "firstName": "user",
    "lastName": "one",
    "phoneNumber": "+7 (111) 111-11-11",
    "city": "Москва",
    "userId": {
        "$oid": "5d5ea4596886b1107c2be849"
    },
    "__v": 0
}


{
    "_id": {
        "$oid": "5d7f70d46b647c1a74d9b8aa"
    },
    "firstName": "user",
    "lastName": "two",
    "phoneNumber": "+7 (222) 222-22-22",
    "city": "Сочи",
    "userId": {
        "$oid": "5d5ea4596886b1107c2be849"
    },
    "__v": 0
}


{
    "_id": {
        "$oid": "5d7f70d46b647c1a74d9b8aa"
    },
    "firstName": "user",
    "lastName": "two",
    "phoneNumber": "+7 (333) 333-33-33",
    "city": "Москва",
    "userId": {
        "$oid": "5d5ea4596886b1107c2be849"
    },
    "__v": 0
}

На вход у меня приходит, например такой массив:
['ne', 'чи']

Ожидается результат поиска по всем документам и следующим полям в этих документах: ['firstName', 'lastName', 'phoneNumber', 'city']
Очевидно, в дальнейшем эти поля могут изменяться: либо поиск только по 'city', либо же только по 'firstName' и 'lastName'
Результат:
{
    "_id": {
        "$oid": "5d7f70d46b647c1a74d9b8aa"
    },
    "firstName": "user",
    "lastName": "one",
    "phoneNumber": "+7 (111) 111-11-11",
    "city": "Москва",
    "userId": {
        "$oid": "5d5ea4596886b1107c2be849"
    },
    "__v": 0
}


{
    "_id": {
        "$oid": "5d7f70d46b647c1a74d9b8aa"
    },
    "firstName": "user",
    "lastName": "two",
    "phoneNumber": "+7 (222) 222-22-22",
    "city": "Сочи",
    "userId": {
        "$oid": "5d5ea4596886b1107c2be849"
    },
    "__v": 0
}

Модель выглядит следующим образом:
const { Schema, model } = require('mongoose')

const bookSchema = new Schema({
  firstName: {
    type: String,
    required: true
  },
  lastName: {
    type: String,
    required: true
  },
  city: {
    type: String,
    required: true
  },
  phoneNumber: {
    type: String,
    required: true
  },
  userId: {
    type: Schema.Types.ObjectId,
    ref: 'User'
  }
})

module.exports = model('Book', bookSchema)

контроллер:
exports.searchBook = (req, res, next) => {
  console.log(req.body) // ['ne', 'чи']

  // just an example of a simple search
  // Book.find({
  //   lastName: 'one'
  // })
  //   .then(book => {
  //     console.log('book', book)
  //   })
  //   .catch(err => {
  //     if (!err.statusCode) {
  //       err.statusCode = 500
  //     }
  //     next(err)
  //   })
}

Моя попытка реализовать эту задачу. Проблема в том, что корректно будет искать, только если на вход будет приходить слово без пробелов: 'со'.
Задача же работать с чем-то вроде этого 'со tw'
exports.searchBook = (req, res, next) => {
  console.log(req.body) // ['ne', 'чи']

  const term = req.body.join(' ')
  console.log(term)

  Book.aggregate([
    {
      $match: {
        $or: [
          {
            firstName: {
              '$regex': term, //  'чи'
              '$options': 'i'
            }
          },
          {
            lastName: {
              '$regex': term,
              '$options': 'i'
            }
          },
          {
            city: {
              '$regex': term,
              '$options': 'i'
            }
          },
          {
            phoneNumber: {
              '$regex': term,
              '$options': 'i'
            }
          }
        ]
      }
    }
  ])
    .then(book => {
      console.log('book', book)
    })
    .catch(err => {
      if (!err.statusCode) {
        err.statusCode = 500
      }
      next(err)
    })
}
Ответить с цитированием
Ответ


Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как правильно сравнивать временные метки? gsdev99 Элементы интерфейса 3 10.02.2019 12:20
Как правильно отрендерить данные на react с разрывом? s24344 Элементы интерфейса 0 28.01.2019 19:35
Как правильно отправлять данные Mukhtar AJAX и COMET 9 05.03.2013 08:56
Как правильно очистить maxlength в input? Маэстро Events/DOM/Window 10 22.06.2011 18:14
Как правильно оформить Send() Алекс97 AJAX и COMET 20 30.10.2008 19:19