繁体   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