Как объединить несколько полей в запросе mon goose? - PullRequest
4 голосов
/ 24 апреля 2020

Я пытаюсь найти () все документы с LIKE 'query.name' в объединенных полях вместо использования $ или для поиска в отдельных.

SQL запрос будет:

SELECT * FROM table WHERE column.name + ' ' + column.surname LIKE query.name

Это текущий код:

Model.find()
.and([
  {
    $or: [
      { name: new RegExp(req.query.name, 'i') },
      { surname: new RegExp(req.query.name, 'i') }
    ]
  },
  {
    $or: [
      { workPlace: new RegExp(req.query.place, 'i') },
      { location: new RegExp(req.query.place, 'i') }
    ]
  }
])

Ответы [ 2 ]

0 голосов
/ 24 апреля 2020

Этого можно достичь в двухэтапном запросе агрегации. Идея состоит в объединении $concat полей имени и местоположения в качестве отдельных атрибутов фильтра на первом этапе с использованием $addFields и затем выполните поиск, используя $match и $regex на следующем этапе.

Пример:

db.collection.aggregate([
  {
    $addFields: {
      nameFilter: {
        $concat: ["$name", " ", "$surname"],
      },
      locationFilter: {
        $concat: ["$workplace", " ", "$location"],
      },
    },
  },
  {
    $match: {
      nameFilter: {
        $regex: req.query.name,
        $options: "i",
      },
      locationFilter: {
        $regex: req.query.place,
        $options: "i",
      },
    },
  },
]);

пн go Пример игровой площадки

0 голосов
/ 24 апреля 2020

Вы должны прочитать о Mon goose virtuals здесь Пример

  var personSchema = new Schema({
    name: {
      first: String,
      last: String
    }
  });

  // compile our model
  var Person = mongoose.model('Person', personSchema);

  // create a document
  var axl = new Person({
    name: { first: 'Axl', last: 'Rose' }
  });

В вашем случае схема может выглядеть примерно так:

var studentSchema = newSchema ({
student: {
   name : String,
   surname : String,
   worplace : String,
   location : STring
})

После этого просто следуйте инструкциям по ссылке, которую я вам дал.

...