【问题标题】:How can I retrieve all documents whose property is a substring of a given parameter?如何检索其属性是给定参数的子字符串的所有文档?
【发布时间】:2013-12-13 09:58:50
【问题描述】:

我有以下 Mongoose 架构

var People= new Schema({
      firstName: String,
      alias: [String]
});

我正在寻找一种方法来返回其中一个 alias 字符串匹配或作为给定值内的子字符串存在的所有文档。

例如:

{ firstName: Jon
  alias: ['foo', 'fuchs']}
{ firstName: Ann
  alias: ['bar', 'fuchsbar']}
{ firstName: Paul
  alias: ['foobar']}
  • 如果我传入foob,我想返回 Jon。
  • 如果我传入foobar,我想返回 Jon、Ann 和 Paul。
  • 如果我传入 fuchs,我想返回 Jon。

在 Mongo 中可以做这样的子串查询吗?

【问题讨论】:

  • 看起来我可以使用 $where 运算符解决这个问题 - 传递给 $where 运算符的函数是否接受参数?
  • 对于子字符串匹配,您可能需要 $regex 运算符。
  • @HectorCorrea 实际上,情况正好相反。我正在 寻找 子字符串,而不是寻找包含 /substring/i 的任何内容。
  • 这似乎会非常慢......它需要点击每个文档和每个数组元素并进行昂贵的(相对而言)搜索。
  • @WiredPrairie 是的。这是在现在选择之后手动(节点端)发生的(这对性能造成了巨大的影响)。如果 Mongo 不支持直接查询(这将比 Node 中的后处理更快),那么可能是时候重新考虑架构设计了。

标签: javascript node.js mongodb mongoose


【解决方案1】:

我建议您索引alias 字段,然后以下列方式为字符串“fuchs”生成查询:

db.people.find( { "alias" : { "$in" : [ "f","fu","fuc", "fuch", "fuchs" ] } } )

您需要自己生成适当的$in 值列表,恐怕查询语言中没有内置功能。

【讨论】:

  • 这样做的一个问题是可扩展性。对于真正的子字符串行为,您还需要“u”、“uc”、“uch”、“uchs”、“c”、“ch”、“chs”、“h”、“hs”和“s” .而且由于查询字符串将比 5 个字符长得多,这会以几何方式增加 $in 选项的数量。
  • 对不起,我没有意识到你的意思是任何子字符串,基于具体的例子,我认为你的意思是从子字符串开始......遗憾的是,没有比这更好的了。
  • 别担心!这只是意味着我们需要重新设计架构/查询!
猜你喜欢
  • 2016-11-02
  • 2014-06-04
  • 2017-07-04
  • 2018-11-28
  • 1970-01-01
  • 1970-01-01
  • 2014-07-05
  • 2021-02-02
  • 2013-03-15
相关资源
最近更新 更多