我有一个Person模型,其中有一个虚拟字段full_name
,其中包含名字,中间名和姓氏。当我想根据他们的全名找到一个人时,此字段非常有用。但是,我读到我无法查询虚拟字段。首先,这是真的吗?为什么?如果我想执行以下操作,最好的方法是什么:
router.get("/:searchTerm", (req, res) => {
const st = req.params.searchTerm;
Person.find({full_name: {$regex: st, $options: "i"}}, (err, ppl) => {
res.json(ppl);
}).limit(30);
});
谢谢!
答案 0 :(得分:1)
在您的情况下,使用正则表达式搜索与搜索词匹配的全名将是一场噩梦。因为您必须将搜索词拆分为单个关键字,然后使用正则表达式在名字和姓氏字段上都匹配每个关键词。聚合可能对查询的复杂性有所帮助,但是您将不得不担心性能警告。正则表达式本身的匹配速度很慢,然后在大型数据集上的聚合甚至会更慢。
所以最好的方法应该是使用文本搜索。在集合上创建一个包括名字和姓氏字段的文本索引,然后使用简单的文本搜索来检索与搜索词匹配的值。这里有一些资源供您入门。