有效的大小写不敏感标签建议?

时间:2019-03-19 07:29:46

标签: javascript node.js mongodb

我正在寻找使用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 });

所以我的问题是,有没有更有效的方法?

我应该使用其他索引吗?

我应该为标签使用其他集合吗?

0 个答案:

没有答案