Perl MongoDB API-过滤器中的正则表达式

时间:2018-09-02 01:43:48

标签: regex mongodb perl

我正在使用MongoDB在Perl中工作。我有一个包含文档的集合,该文档的文本字段很大,因此我需要能够找到该字段中包含多个字符串的所有行。

例如,如果这是一个电影报价数据库,则一行将具有值:

  

我们必须彻底销毁阿拉基斯地区所有的香料生产。公会和   整个宇宙取决于香料。能够毁灭事物的人   控制事物。

我希望能够用“香料”,“阿拉基斯”和“吉尔德”这两个词来匹配该行,所有这些词都必须在文本中。

只有在提供的字词恰好按正确顺序排列时,我当前的方法才能实现匹配:

$db->get_collection( 'quotes' )->find( { quote => qr/spice.*Arrakis.*Guild/i } );

那是一场比赛,但是

$db->get_collection( 'quotes' )->find( { quote => qr/Guild.*spice.*Arrakis/i } );

不匹配。

如果我使用的是SQL数据库,则可以:

... WHERE quote LIKE '%spice%' and quote LIKE '%Arrakis%' and quote LIKE '%Guild%'

但是在MongoDB界面上,每个字段只能拍摄一张照片。

在一个正则表达式中是否需要匹配多个单词的方法,还是在MongoDB界面中的字段上获得不止一个裂纹的另一种方法?

1 个答案:

答案 0 :(得分:0)

一种方式:一堆积极的前瞻性断言:

#!/usr/bin/perl
use warnings;
use strict;
use feature qw/say/;
my @tests = ("The Guild demands that the spice must flow from Arrakis",
             "House Atreides will be transported to Arrakis by the Guild.");
for my $test (@tests) {
  if ($test =~ m/^(?=.*spice)
                  (?=.*Guild)
                  (?=.*Arrakis)/x) {
    say "$test: matches";
  } else {
    say "$test: fails";
  }
}

产生:

  

公会要求香料必须从Arrakis中流出:火柴

     

公会将莱托公爵运送到阿拉基斯:失败