我想用貓鼬做一個搜索功能,我必須能夠進行多個領域的研究(用貓鼬,在NodeJS中)。
所以,我做這樣的事情:
const result = await myModel.find({
$or [{condition1: "value1"}, {condition2: "value2"}, etc...]
});
但是,我想按回傳的物件具有的條件數對結果進行排序。喜歡 :
如果我有 2 個條件,我想首先顯示符合2 個條件的物件,然后是符合第 1 個條件的物件,最后是符合第 2 個條件的物件。
你們知道我該怎么做嗎?:)
提前致謝 !
================編輯=================
這是新的搜索功能:
/**
* Search function which returns users matching jobs and skills.
*
* @param {Array[String]} jobs
* @param {Array[String]} skills
* @return {Array[UserModel]} users
*/
async search(jobs, skills) {
// Normalized arrays of jobs, skills and fields (to use it in a mongoose request).
const jobSkills = [];
const associatedSkills = [];
const fields = [];
for (const job of jobs) {
jobSkills.push({
$cond: [
{
$eq: ["$jobSkills", job],
},
2,
0,
],
});
fields.push({
jobSkills: job,
});
}
for (const skill of skills) {
associatedSkills.push({
$cond: [
{
$eq: ["$associatedSkills", skill],
},
1,
0,
],
});
fields.push({
associatedSkills: skill,
});
}
// Request to find users matching jobs and skills.
const users = await UserModel.aggregate([
{
$match: {
$or: fields,
},
},
{
$addFields: {
sortField: {
$sum: jobSkills.concat(associatedSkills),
},
},
},
{
$sort: {
sortField: -1,
},
},
]);
return users;
}
聚合日志:
Aggregate {
_pipeline: [
{ '$match': [Object] },
{ '$addFields': [Object] },
{ '$sort': [Object] }
],
_model: Model { User },
options: {}
}
uj5u.com熱心網友回復:
通常,檔案要么匹配查詢謂詞,要么不匹配。實際上并沒有一個檔案比另一個“更好”匹配的概念。因此,您似乎希望在新欄位中生成自定義值并對其進行排序。這需要通過聚合來完成。
所以在 之后$match,我們需要一個$addFields有效地復制查詢謂詞的階段。對于每一個,它將被包裝在一個條件陳述句 ( $cond) 中,我們在其中添加1匹配或0其他內容,例如:
{
$cond: [
{
$eq: [
"$condition1",
"value1"
]
},
1,
0
]
}
然后將$sum它們拉在一起以生成最終分數以進行排序。
總之,聚合將如下所示:
db.collection.aggregate([
{
$match: {
$or: [
{
condition1: "value1"
},
{
condition2: "value2"
}
]
}
},
{
$addFields: {
sortField: {
"$sum": [
{
$cond: [
{
$eq: [
"$condition1",
"value1"
]
},
1,
0
]
},
{
$cond: [
{
$eq: [
"$condition2",
"value2"
]
},
1,
0
]
}
]
}
}
},
{
$sort: {
"sortField": -1
}
}
])
操場示范在這里
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/526582.html
上一篇:Pandas按日期時間排序
