【问题标题】:Spring boot mongodb substring in string or index of字符串或索引中的 Spring boot mongodb 子字符串
【发布时间】:2022-11-23 03:14:24
【问题描述】:

我有一个名为 bad_words 的带有 mongodb 集合的 spring boot,它看起来像这样

@Document(collection ="bad_words")
@Data
public class BadWord {

   @Id
   private String word;
}

现在我想搜索 _id 是否是提供的坏词的一部分。

如果我试试这个

Query query = new Query();
query.addCriteria(Criteria.where("_id").regex(".*shit.*", "i"));
BadWord badWord = mongoOperations.findOne(query, BadWord.class);

我找到了匹配项,但如果我尝试这个

Query query = new Query();
query.addCriteria(Criteria.where("_id").regex(".*shit1234.*", "i"));
BadWord badWord = mongoOperations.findOne(query, BadWord.class);

找不到匹配项。如何反向检查 _id 是提供的单词的子字符串还是完全匹配。

我的目标是查找单词是否包含 id 中的坏词,并将坏词的字符替换为字符 *

下面是文档的一些例子

{
 "_id": "badword1",
 "_class": "com.example.models.BadWord"
},
{
 "_id": "badword2",
 "_class": "com.example.models.BadWord"
}

我想过滤的话

  • 坏词1
  • 坏词 1 坏词 2
  • 坏词123

有什么帮助吗?

【问题讨论】:

  • 我不清楚您为什么要将 1234 字符附加到搜索字符串中。这是为了减少您进行的搜索次数吗?
  • 所以这是可变的,它可以是任何东西,例如我添加的。这是用户输入的坏词。我想查找提供的坏词的子字符串是否在 id 中。
  • 是的,但是您的第一个查询没有完成吗?您的第一个查询将(正确)标记更多的潜在文件比第二个好吗?
  • 不,它不工作。对于第一个查询,如果 id 和输入值的格式为 ("_id", "input") ex: ("badword", "badword") 或 ("badword123", "badword") 它将起作用。但如果我有 ("badword", "badwordanotherbadword") 它不会。

标签: mongodb spring-boot aggregation-framework spring-data-mongodb


【解决方案1】:

我的印象是您正在寻找其(用户生成的)_id 包含来自预定义列表的一个或多个单词(或短语)的文档。我不认为做一个“反向检查”,你在一个连接的字符串中提供所有的单词来进行正则表达式搜索是可行的方法。

相反,使用 $in 怎么样?考虑要识别的单词列表是字符串 "one""two""three"。相反,如何使用 the $in operator 向它传递一个正则表达式搜索列表(一个用于每个要识别的词)?查询可能如下所示:

db.foo.find({_id:{$in:[/one/i,/two/i,/three/i]}})

两个限制(一个在 MongoDB 中,一个在 mongoplayground 中)阻止我直接用 playground 示例进行演示。考虑集合中的以下文档:

test> db.foo.find()
[
  { _id: 'one' },
  { _id: 'between one another' },
  { _id: 'two' },
  { _id: 'two three' },
  { _id: 'two and three' },
  { _id: 'four' },
  { _id: 'five' },
  { _id: 'word' },
  { _id: 'normal' },
  { _id: 'normal word' }
]

该查询成功识别了五个有问题的文档:

test> db.foo.find({_id:{$in:[/one/i,/two/i,/three/i]}})
[
  { _id: 'between one another' },
  { _id: 'one' },
  { _id: 'two' },
  { _id: 'two and three' },
  { _id: 'two three' }
]

【讨论】:

  • 嘿感谢张贴。但我不确定这是否有效。我只有一句话。即使我这样做。 db.foo.find({_id:{$in:['one'}}),这并没有解决问题。我不确定我是否解释错了问题。
  • 你能得到 id 为 1 且输入(列表中的单词)为“onetwo”的结果吗
  • 您在上面的评论中使用了精确的字符串匹配语法,这将不是工作。它需要是添加到 $in 列表中的正则表达式运算符。您能否使用一些示例文档、示例值更新您的问题,并注意哪些文档应该匹配,哪些不应该匹配?
  • 这是主要问题。我希望现在清楚了。
  • 谢谢!如果第二个文档 ({ "_id": "badword2" }) 应该匹配,为什么过滤器列表中的第二个条目是 badword1badword2 而不是 badword2
猜你喜欢
  • 2021-04-25
  • 2010-12-15
  • 2023-03-11
  • 1970-01-01
  • 1970-01-01
  • 2019-06-03
  • 1970-01-01
  • 1970-01-01
  • 2015-01-13
相关资源
最近更新 更多