简介
我正在使用mongodb和mongoose ODM构建一个搜索功能。代码库已经有了一个使用JavaScript的搜索功能。密码
terms.every((term) => {
const cleanedTerm = term.trim();
return (
usernameLower.includes(cleanedTerm) ||
nameLower.includes(cleanedTerm) ||
userTagsString.includes(cleanedTerm) ||
userLocationString.includes(cleanedTerm)
);
});
字符串
首先获取所有用户,然后进行过滤。返回由数组的任何字段中的每个元素组成的文档。
我的方法
async function searchUsers(termsArray) {
const query = { $in: termsArray }
return await Profile.find({
$or: [
{ username: query },
{ name: query },
{ "location.name": query },
{ tags: { $all: termsArray } },
],
});
}
型
问题和示例基本上,这个查询返回的是与术语或标签的任何元素相匹配的文档。示例-假设简档具有标签[JS,TS,OSS]并且搜索项是[JS,TS,OSS,JAVA],则简档也被返回,这是不期望的,因为JAVA不存在。
2条答案
按热度按时间ie3xauqp1#
因此,如果您只希望在
termsArray
中列出的所有标记都存在于配置文件中时返回配置文件,并且如果任何termsArray
项存在于同一配置文件的username
或name
或location.name
中,则需要将$and
与$or
组合。像这样重构聚合:字符串
$and
声明这两个条件都必须为真。其中一个条件是$or
,因此$or
中的3个条件中的任何一个都可以为真,但{ tags: { $all: termsArray } }
也必须为真。请参阅mongoplayground以获取工作示例。我已经把你的
Profile
属性作为username
,name
,location
作为一个带有name
属性的对象,tags
作为一个值数组。你会看到JAVA这个词出现在前4个文档中,但只出现在一个区域。只有在第5个文档中,JAVA才会出现在属性中,并且tags
具有完全匹配。如果你运行它,你会看到只返回第五个文档。这解决了你所描述的问题。让我知道你的问题是否不同。9lowa7mx2#
第一件事,你有使用$或任何条件满足它将返回记录,任何用户名或名称匹配的记录,该记录是有这个[JS,TS,OSS,JAVA]它是有效的,你必须使条件使用$AND或其他方式
你可以在查询时尝试$ size
字符串