Состояние поиска агрегатов Mongodb - PullRequest
0 голосов
/ 09 апреля 2020

Я хочу установить условие «Где» для присоединяемой записи при получении всех записей. Я реализовал множество решений для $ lookup, но не получил правильного решения. Вот мой nodejs код. Надежда

Схема пост-модели

const postsSchema = new mongoose.Schema({
    post_title: String,
    post_location: { type: mongoose.ObjectId, ref: "locations" },
});

Схема модели местоположения

const locationsSchema = new mongoose.Schema({
    location_name: String,
    address: String,
});

Код контроллера

var dataQuery = Posts.aggregate();
dataQuery.lookup({ from: 'locations', localField: 'post_location', foreignField: '_id', as: 'post_location' });
dataQuery.unwind("post_location");
dataQuery.exec().then(postsData => {

});

Вывод

[{
    "_id": "5e8f179e2bd9f824fce3efd2",
    "post_title": "Post title 1"
    "post_location": {
        "_id": "5e8ee8ae2bd9f824fce3e621",
        "location_name": "Shimla",
        "address": "Shimla, Himachal Pradesh, India",
    },
}
{
    "_id": "5e8f179e2bd9f824fce3efd2",
    "post_title": "Post title 2"
    "post_location": {
        "_id": "5e8ee8ae2bd9f824fce3e621",
        "location_name": "Goa",
        "address": "Goa, India",
    },
}]

Я хочу выполнить поиск по location_name или, address. Но не получил правильный код для реализации. Пожалуйста, помогите мне?

1 Ответ

1 голос
/ 09 апреля 2020

Все, что вам нужно сделать, это добавить $ match этап к агрегации после вашего unwind этапа, как показано ниже:

Node.js код:

dataQuery.match({
  $or: [
    { "post_location.location_name": new RegExp("Shimla", "i") },
    { "post_location.address": new RegExp("Shimla", "i") }
  ]
});

Запрос к БД:

{
 $match : {
      $or: [
        { "post_location.location_name": /Shimla/i) },
        { "post_location.address": /Shimla/i }
      ]
    }
}

Здесь мы проверяем слово Shimla, которое будет доступно в полях location_name или address из post_location объекта и получение только тех документов, которые соответствуют этим критериям. Поскольку мы используем регулярные выражения, мы включили i, чтобы не учитывать регистр, это необязательно.

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