构造MongoDB查询以模拟JavaScript过滤逻辑(filter+every),使用Mongoose对多个搜索词进行过滤

9avjhtql  于 2023-08-04  发布在  Go
关注(0)|答案(2)|浏览(93)

简介

我正在使用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不存在。

ie3xauqp

ie3xauqp1#

因此,如果您只希望在termsArray中列出的所有标记都存在于配置文件中时返回配置文件,并且如果任何termsArray项存在于同一配置文件的usernamenamelocation.name中,则需要将$and$or组合。像这样重构聚合:

async function searchUsers(termsArray) {
   const query = { $in: termsArray };
   return await Profile.find({
       $and: [
           {
               $or: [
                   { username: query },
                   { name: query },
                   { "location.name": query }
               ]
           },
           { tags: { $all: termsArray } }
       ]
   });
}

字符串
$and声明这两个条件都必须为真。其中一个条件是$or,因此$or中的3个条件中的任何一个都可以为真,但{ tags: { $all: termsArray } }也必须为真。
请参阅mongoplayground以获取工作示例。我已经把你的Profile属性作为usernamenamelocation作为一个带有name属性的对象,tags作为一个值数组。你会看到JAVA这个词出现在前4个文档中,但只出现在一个区域。只有在第5个文档中,JAVA才会出现在属性中,并且tags具有完全匹配。如果你运行它,你会看到只返回第五个文档。这解决了你所描述的问题。让我知道你的问题是否不同。

9lowa7mx

9lowa7mx2#

第一件事,你有使用$或任何条件满足它将返回记录,任何用户名或名称匹配的记录,该记录是有这个[JS,TS,OSS,JAVA]它是有效的,你必须使条件使用$AND或其他方式
你可以在查询时尝试$ size

async function searchUsers(termsArray) {
const query = { $in: termsArray }
return await Profile.find({
 $or: [
  { username: query },
  { name: query },
  { "location.name": query },
  { tags: { $size: termsArray.length, $all: termsArray } },
 ],
});
}

字符串

相关问题