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