【问题标题】:MongoDB / Mongoose - Return only array items that matches $textMongoDB / Mongoose - 仅返回与 $text 匹配的数组项
【发布时间】:2020-07-15 17:01:07
【问题描述】:

我有以下对象:

user: {
 _id: "xxx",
 name: "Lucas",
 items: [
  { name: "shoes", description: "nice shoes" },
  { name: "pants", description: "old pants" },
 ],
 places: [
  {name: "my house", loc: { type: "Point", coordinates: [-27, -43] }}
 ]
}

我需要执行仅返回项目的文本搜索 ($text)。 例如:

await User.find({ $text: { $search: "shoes" } });

这行得通!但它也返回裤子,因为它返回用户而不仅仅是数组项。这就是问题所在,我需要对数据库中的项目进行分页。所以我只需要返回与 $text 搜索匹配的数组项。我知道如果 items 本身是一个集合,它会起作用,但在我的情况下,我需要用户内部的那些,因为我将项目的 $text 和位置的 $geoWithin 组合在一起。

那么,我如何返回用户只保留与我的 $text 搜索匹配的项目?

【问题讨论】:

  • 好问题。但我想知道是否有很好的方法来解决这个问题而不将项目放在单独的集合中。您可以使用查找聚合来连接用户和项目,因此将它们组合起来没有问题。
  • 您的意思是,创建一个将用户和衣服作为 2 个不同集合的视图,然后查询该视图?
  • 我的意思是 lookup aggregation 甚至是猫鼬填充
  • 好的,我试试看。谢谢

标签: mongodb mongoose full-text-search


【解决方案1】:

您是否尝试过使用正则表达式 要在以逗号分隔的字段查询条件列表中包含正则表达式,请使用 $regex 运算符。例如:

{ name: { $regex: /acme.*corp/i, $nin: [ 'acmeblahcorp' ] } }

或类似

db.users.find({"name": /^m/})

https://docs.mongodb.com/manual/reference/operator/query/regex/

【讨论】:

  • 我对正则表达式不是很熟悉。它是作为文本搜索工作还是仅在字符串完全相同的情况下才能找到?例如:如果我有一个名为“Mario T-Shirt”的商品,并且用户搜索“Mario”,那么正则表达式是否能够找到?
猜你喜欢
  • 2019-08-18
  • 1970-01-01
  • 2019-04-28
  • 2017-09-12
  • 2015-05-27
  • 2023-03-06
  • 1970-01-01
  • 2016-05-20
  • 2012-08-31
相关资源
最近更新 更多