Как написать запрос mongoDB для сопоставления любого элемента в массиве вложенных документов с любым элементом в массиве Typescipt? - PullRequest
0 голосов
/ 31 октября 2019

У меня есть база данных mongoDB, содержащая События . Каждое событие определяется несколькими полями, включая массив жанров (которые являются вложенными документами, состоящими из {genre и subGenre}).

Например: событие может иметь {жанр: "музыка", subGenre: "джаз"} и {жанр: "музыка", subGenre: "блюз"}. См. event.js - модель. В этом случае 2 субдокумента «жанр» добавляются в массив «жанры» в документе «Событие» в базе данных.

Вернитесь в мое приложение узла - см. query.ts - Iя пытаюсь понять, как выполнить запрос, который позволяет пользователю искать все события, соответствующие их жанровым предпочтениям.

Итак:

  • Событие определяется массивом жанров. (в базе данных) и
  • предпочтения пользователя определяются массивом жанров (в приложении
    ).

Я хочу определитьЗапрос mongoDB, который возвращает все события, где есть совпадение любой комбинации 1 {genre, subGenre} между двумя массивами.

Я смотрел на $ в Query Selector в mongoDBдокументацию и подозреваю, что это может потребоваться ... но программно, как мне написать запрос, который расширяется и включает все значения в переменной "searchGenres" в query.ts ?

Заранее большое спасибо за ваши мысли.


event.js: модель mongoDB для «событий», определенная с использованием Mongoose - фрагмент:

let mongoose    = require('mongoose');

let EventSchema = new mongoose.Schema({

genres: [
          {
            genre:      String,
            subGenre:   String
          }
       ]
)};

module.exports =  mongoose.model('Event', EventSchema);

query.ts:

import mongoose   = require('mongoose');
let Event         = require ('../models/event');

class Genre {
    genre:      string;
    subGenre:   string;

    constructor (gen: string, sub: string) {
        this.genre      = gen;
        this.subGenre   = sub;
    }
}

async function runQuery()
{
    let searchGenres : Array<Genre> = new Array<Genre>();

    // populate searchGenres with some data here... e.g.
    const searchGenre1 : Genre = new Genre ('music', 'jazz');
    const searchGenre2 : Genre = new Genre ('music', 'rock');

    searchGenres.push(searchGenre1);
    searchGenres.push(searchGenre2);

    // Query logic here:
    // Return all events from the database, if the 'genres' array
    // in the document matches any element in the searchGenres array
    // defined above..

    const events = await Event.find ({
                                       'genres': {?help? }

                                    });

}
```

1 Ответ

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

Сегодня, после некоторого самообразования, я нашел решение, которым я доволен - добавить в конец query.ts:

type GenreQuerySelector = { genres: { $elemMatch: { 'genre': string; 'subGenre': string; }; }; };

let querySelectors : Array< GenreQuerySelector > = new Array< GenreQuerySelector >();

for (let genre of searchGenres) {

    const genreQuery : GenreQuerySelector = {
        genres: {
                    $elemMatch: {
                                    'genre':    genre.genre,
                                    'subGenre': genre.subGenre
                                }
                }
     };        
     querySelectors.push(genreQuery);
};

const events = await Event.find  ({ $or: querySelectors }).exec();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...