MongoDb Query:检查字符串是否包含字段值

时间:2018-02-14 07:44:47

标签: mongodb mongodb-query

我知道可以检查字段值是否像这样的字符串:

db.users.findOne({"username" : {$regex : ".*jo*"}});

但我想要的是检查字符串是否包含字段值  如果我有这样的字符串:"John, Smith, ",我想匹配用户名为"John""Smith"的用户。

我知道可以拆分字符串并使用$in运算符,但想知道是否可以使用字符串比较轻松完成。

2 个答案:

答案 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只会在JohnSmith在字段中时返回匹配。

详细说明实际的$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" ..等