[英]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.