我有一個名為 User 的模型。
const userSchema = new Schema({
technologiesStack: [
{
technology: Id
yearsOfExperience: Number
}
]
});
和模特作業,每個作業都有他們的現場技術要求
const jobSchema = new Schema({
techsRequired: [
{
technology: Id,
yearsOfExperience: Number
}
]
});
現在,我想向每個用戶推薦個性化的作業,所以我需要獲得與用戶的技術堆疊匹配的所有作業。
我怎樣才能做到這一點?
示例 代碼
uj5u.com熱心網友回復:
當前的結構使其非常困??難,但歸根結底,它只需要對陣列進行多次過濾。
我們的策略將是首先匹配用戶滿足其要求的所有作業,$all您已經開始這樣做 - 這一步不是必需的,但它只是為了減少匹配檔案的規模。
下一步將是迭代需求,將每個需求與用戶技術堆疊相匹配,并確保滿足年份要求,如下所示:
const userTechInput = [
{
technology: 1,
yearsOfExperience: 6
},
{
technology: 3,
yearsOfExperience: 15
}
]
db.collection.aggregate([
{
$match: {
"technologiesStack.technology": {
$all: userTechInput.map((v) => v. technology)
}
}
},
{
$addFields: {
matched: {
$filter: {
input: "$technologiesStack",
as: "tech",
cond: {
$lte: [
"$$tech.yearsOfExperience",
{
"$getField": {
"field": "yearsOfExperience",
"input": {
"$arrayElemAt": [
{
$filter: {
input: userTechInput,
as: "userTech",
cond: {
"$eq": [
"$$userTech.technology",
"$$tech.technology"
]
}
}
},
0
]
}
}
}
]
}
}
}
}
},
{
$match: {
$expr: {
$eq: [
{
$size: "$matched"
},
{
$size: "$technologiesStack"
}
]
}
}
}
])
蒙戈游樂場
請注意,我使用了Mongo 5.0 版中添加的新$getField運算子,這只是為了方便,為了簡化已經很復雜的$addFields階段,它讓你從物件中獲取一個欄位,在本例中是yearsOfExperience來自輸入的欄位。如果您使用的是較舊的 Mongo 版本,則另一種選擇是ObjectToArray將輸入 obj 轉換為陣列,對其進行過濾,然后比較“$$v.yearOfExperience”,顯然它會使代碼示例更大。
我要推薦的最后一件事,除非這是一個玩具示例,如果您打算在生產中使用此代碼,我建議您重新考慮您的結構和方法。如您所見,當前的結構很難查詢,另外您可能想要計算匹配分數而不是完全匹配,例如,如果要求是 15 年,nodejs而我有 14 年,它會自動被過濾掉,但我們知道,在現實世界中,事情并不是那么非黑即白。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/406236.html
標籤:
上一篇:GET方法中沒有決議正文
