在 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的主要内容,如果未能解决你的问题,请参考以下文章
mongodb 中 Aggregation 的管道和分片集合( Pipeline and Sharded Collections)