我知道可以检查字段值是否像这样的字符串:
db.users.findOne({"username" : {$regex : ".*jo*"}});
但我想要的是检查字符串是否包含字段值
如果我有这样的字符串:"John, Smith, "
,我想匹配用户名为"John"
和"Smith"
的用户。
我知道可以拆分字符串并使用$in
运算符,但想知道是否可以使用字符串比较轻松完成。
答案 0 :(得分:0)
如果我已正确理解您的问题,我会认为以下$regex
是您所追求的。
我的收藏如下:
/* 1 */
{
"_id" : ObjectId("5a8498a29d1ed018c7f648ca"),
"name" : "John, Smith, "
}
查找和$regex
看起来像:
db.foo.find({ name: { $regex: 'John.*Smith' } }, { _id : 0 })
如果您需要不区分大小写:
db.foo.find({ name: { $regex: 'john.*smith', $options: 'i'} }, { _id : 0 })
输出:
/* 1 */
{
"name" : "John, Smith, "
}
如果我要跑:
db.foo.find( { name: { $regex: 'Bill.*Smith', $options: 'i' }}, { _id : 0})
或
db.foo.find( { name: { $regex: 'John.*Bill', $options: 'i' } }, { _id : 0})
输出:
Fetched 0 record(s) in 1ms
因此$regex
只会在John
和Smith
在字段中时返回匹配。
详细说明实际的$regex
本身:
.
匹配除换行符之外的任何单个字符
*
匹配前面的表达式0次或更多次
$option
i
用于不区分大小写
答案 1 :(得分:0)
从Mongodb 3.4开始,他们引入了$indexOfCP
运算符。
搜索字符串以查找子字符串的出现并返回 第一次出现的UTF-8码点索引(从零开始)。如果 找不到子字符串,返回-1。
这样可行:
db.user.aggregate(
[
{
$addFields:
{
searchIndex: { $indexOfCP: [ "$username", "John, Smith, " ] },
}
},
{
$match: {
searchIndex: {$ne: -1}
}
},
]
)
并且这匹配用户的用户名如:" Jo"," John"," Smit"," Smith" ..等