在 MongoDB 中使用 $and 的多个 $regex

Posted

技术标签:

【中文标题】在 MongoDB 中使用 $and 的多个 $regex【英文标题】:Multiple $regex using $and in MongoDB 【发布时间】:2013-12-18 12:14:48 【问题描述】:

我收藏了一些下一条记录:


    "_id" : ObjectId("52b18fb2a21351b2bb29dfc7"),
    "title" : "aaa"


    "_id" : ObjectId("52b18fd0d17d7f69e078f7b7"),
    "title" : "bbb"


    "_id" : ObjectId("52b18fd3d17d7f69e078f7b8"),
    "title" : "ccc"

下一个查询结果如我们预期的那样给出了 1 条记录(title="aaa"):

db.test.find(
     title:$regex:'aaa'
)

但是当我们对 $ 使用复杂条件时,我们得到了意想不到的结果:

db.test.find(
    $and: [
        title:$regex:'aaa',
        title:$regex:'bbb'
    ]
)

在这种情况下我需要查询,因为我将使用带停用词的选择,例如:

db.test.find(
    $and: [
        title:$regex:'aaa',
        title:$regex:'bbb',
        title:$not:/bbb/i,
    ]
)

使用上面的查询,我希望结果中只有一个字段(title="aaa")。

我知道如何使用聚合来解决这个问题,但我希望有另一种方法来解决它。

谢谢!

【问题讨论】:

【参考方案1】:

只需构建正确的正则表达式

pattern "/A AND B/"
pattern "/NOT (NOT A OR NOT B)/"

正则表达式:

"/^(^A|^B)/"

或者这个

/(?=.*word1)(?=.*word2)/

【讨论】:

我相信使用这样的正则表达式我会遇到性能问题。此外,另一种类似的方式 - 使用 $where。但是,如果我的表中有超过 10 条记录,那么执行该查询的时间将无限长..【参考方案2】:

嗯,用另一个数据测试,得到了预期的结果:

/* 0 */

    "_id" : ObjectId("52b18fb2a21351b2bb29dfc7"),
    "title" : "aaa"


/* 1 */

    "_id" : ObjectId("52b18fd0d17d7f69e078f7b7"),
    "title" : "bbb"


/* 2 */

    "_id" : ObjectId("52b18fd3d17d7f69e078f7b8"),
    "title" : "ccc"


/* 3 */

    "_id" : ObjectId("52b19606d17d7f69e078f7b9"),
    "title" : "aaa test"


/* 4 */

    "_id" : ObjectId("52b19624d17d7f69e078f7ba"),
    "title" : "aaa test wel"

查询:

db.test.find(
    $and: [
        title:$regex:'aa',
        title:$regex:'t',
        title:$not:/wel/
    ]
)

回复:

/* 0 */

    "_id" : ObjectId("52b19606d17d7f69e078f7b9"),
    "title" : "aaa test"

也许,仅当标题和条件包含西里尔符号时才会重现该问题。现在要重现它..

【讨论】:

以上是关于在 MongoDB 中使用 $and 的多个 $regex的主要内容,如果未能解决你的问题,请参考以下文章

使用具有嵌套或条件的多个 where(或 AND)?

在 hive 中使用多个 or 和 and 条件时出错

mongodb 中 Aggregation 的管道和分片集合( Pipeline and Sharded Collections)

Mongodb $lookup 使用多个条件 mongodb

在 mongodb 中使用 $and 和 $match

使用 mongo.bson.from.list() 和 $or 表达式从 R 查询 MongoDB