簡體   English   中英

如何編寫 mongoDB 查詢以匹配子文檔數組中的任何元素與 Typescipt 數組中的任何元素?

[英]How to write a mongoDB query to match any element in an array of subdocuments against any element in a Typescipt Array?

我有一個包含Events的 mongoDB 數據庫。 每個事件由多個字段定義,包括一個流派數組(它們是由 {genre 和 subGenre} 組成的子文檔)。

例如:一個事件可以是 {genre: "music", subGenre: "jazz"} 和 {genre: "music", subGenre: "blues"}。 請參閱event.js - model。 在這種情況下,2個“流派”子文檔被添加到數據庫中事件文檔的“流派”數組中。

回到我的節點應用程序 - 請參閱query.ts - 我正在嘗試找出如何運行一個查詢,讓用戶搜索與其類型偏好匹配的所有事件。

所以:

  • 事件由一系列類型(在數據庫中)定義,並且
  • 用戶的偏好由一系列類型定義(在
    應用)。

我希望定義一個 mongoDB 查詢,該查詢返回在 2 個 arrays 之間存在任何 1 個 {genre, subGenre} 組合匹配的所有事件。

我在 mongoDB 文檔中查看了$in Query Selector並懷疑它可能需要使用......但是以編程方式,我如何編寫一個擴展以包含 query.ts 中變量“ searchGenres ”中的所有值的查詢?

非常感謝您的想法。


event.js: mongoDB Model 用於使用 Mongoose 定義的“事件” - 片段:

let mongoose    = require('mongoose');

let EventSchema = new mongoose.Schema({

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

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

查詢.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? }

                                    });

}
```

經過今天的一些自我教育,我想出了一個我很滿意的解決方案 - 到 append 到 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();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM