我正在寻找使用MongoDB进行不区分大小写的标签建议的最有效方法。
假设我在“书籍”收藏集中有以下文档:
[
{ name: "gone fishing", tags: ["fish", "fiSHIng", "travel"], createdByUserId: 1, },
{ name: "fishing around", tags: ["travel", "top"], createdByUserId: 1, },
{ name: "fishing mania", tags: ["fish", "mad"], createdByUserId: 1, },
{ name: "mega bears", tags: ["travel", "animals", "Fish"], createdByUserId: 1, },
{ name: "bears bears", tags: ["cute", "fish"], createdByUserId: 2, }
]
当ID为“ 1”的用户查询“ fis”时,返回的结果应类似于:
[
{ tag: "fish", count: 2 },
{ tag: "Fish", count: 1 },
{ tag: "fiSHIng", count: 1 }
]
集合中已经有一个“文本”索引:
db.books.createIndex( {
name: "text",
tags: "text"
});
我目前正在使用汇总功能:
[{
$match: {
createdByUserId: userId
}
},
{
$project: {
tags: 1
}
},
{
$unwind: {
path: "$tags"
}
},
{
$project: {
tags: 1,
lower: {
$toLower: "$tags"
}
}
},
{
$match: {
lower: {
$regex: query
}
}
},
{
$group: {
_id: "$tags",
count: {
$sum: 1
}
}
},
{
$project: {
_id: 0,
tag: "$_id",
count: 1
}
},
{
$sort: {
count: -1
}
}
]
连同“文本”索引,我添加了以下索引:
db.books.createIndex({ tags: 1 });
所以我的问题是,有没有更有效的方法?
我应该使用其他索引吗?
我应该为标签使用其他集合吗?