MongoDB:20-MongoDB- 正则表达式

来源:互联网 发布:mac 查看磁盘剩余空间 编辑:程序博客网 时间:2024/06/06 09:43
  1. 正则表达式是使用单个字符串来描述、匹配一系列符合某个句法规则的字符串。
  2. 许多程序设计语言都支持利用正则表达式进行字符串操作。
  3. MongoDB 使用 $regex 操作符来设置匹配字符串的正则表达式。
  4. MongoDB使用PCRE (Perl Compatible Regular Expression) 作为正则表达式语言。
  5. 不同于全文检索,我们使用正则表达式不需要做任何配置。

使用正则表达式

  • 演示数据:
  1. /* 1 */
  2. {
  3. "_id" : ObjectId("59efd2ed2931dbc1733a94e0"),
  4. "address" : {
  5. "province" : "HeNan",
  6. "city" : "ZhengZhou",
  7. "pincode" : "123"
  8. },
  9. "tags" : [
  10. "music",
  11. "cricket",
  12. "blogs"
  13. ],
  14. "name" : "fly"
  15. }
  16. /* 2 */
  17. {
  18. "_id" : ObjectId("59efd2ed2931dbc1733a94e1"),
  19. "address" : {
  20. "province" : "HeBei",
  21. "city" : "HanDan",
  22. "pincode" : "234"
  23. },
  24. "tags" : [
  25. "music",
  26. "basket",
  27. "blogs"
  28. ],
  29. "name" : "chen"
  30. }
  31. /* 3 */
  32. {
  33. "_id" : ObjectId("59efd2ed2931dbc1733a94e2"),
  34. "address" : {
  35. "province" : "ChongQing",
  36. "city" : "ChongQing",
  37. "pincode" : "456"
  38. },
  39. "tags" : [
  40. "music",
  41. "writing",
  42. "running"
  43. ],
  44. "name" : "wang"
  45. }

  • 查找name包含 f字符串的用户:

  1. db.user.find({name:{$regex:"f"}})

  • 以上查询也可以写为:

  1. db.user.find({name:/f/})
  • 查找name包含 f字符串的用户,忽略大小写:
  1. db.user.find({name:{$regex:"F", $options: 'i'}})
  2. 或者
  3. db.user.find({name:/F/i})

正则可选项

  • mongodb和其他语言标准正则稍有不同,有自己的标准。

  1. $options的可选值
  2. i 忽略大小写;
  3. m 多行查找,如果内容里面不存在换行符号(例如 \n)或者构造上没有(start/end),该选项没有任何效果;
  4. x忽视空吧字符串空白字符除了被转义的或在字符类中的以外完全被忽略,在未转义的字符类之外的 # 以及下一个换行符之间的所有字符,包括两头,也都被忽略
  5. s 圆点元字符(.)匹配所有的字符,包括换行符

数组元素使用正则表达式

  • 我们还可以在数组字段中使用正则表达式来查找内容。

  1. db.user.find({tags:{$regex:"basket"}})

优化正则表达式查询
  1. 如果你的文档中字段设置了索引,那么使用索引相比于正则表达式匹配查找所有的数据查询速度更快。
  2. 如果正则表达式是前缀表达式,所有匹配的数据将以指定的前缀字符串为开始。例如: 如果正则表达式为 ^F ,查询语句将查找以 F为开头的字符串。
  3. db.user.find({name:{$regex:"^F", $options: 'i'}})


正则表达式中使用变量

  • 正则表达式中使用变量。一定要使用eval将组合的字符串进行转换,不能直接将字符串拼接后传入给表达式。否则没有报错信息,只是结果为空!实例如下:

  1. var name=eval("/" + 变量值key +"/i");

  • 以下是模糊查询包含f关键词, 且不区分大小写:

  1. name:eval("/"+f+"/i") // 等同于 title:{$regex:f,$Option:"$i"}

使用正则表达式的更新操作:

  1. db.user.update( { name:/F/i}, { $set: { 'site':'http://blog.csdn.net/fly910905' } } , false, true)

  • 参数有顺序,false是upsert,如果没有就插入新的。true就是multi多条记录更新,所有匹配到的结果。或者直接指定{ multi: true }:

  1. db.user.update( { name:/Q/i}, { $set: { 'site':'http://blog.csdn.net/fly910905' } } , { multi: true })

  1. db.collection.update(criteria,objNew,upsert,multi)
  2. 参数说明:
  3. criteria:用于设置查询条件的对象(必填)({},表示更新所有)
  4. objNew:用于设置更新内容的对象(必填)
  5. upsert:如果记录已经存在,更新它,否则新增一个记录,取值为01[true为插入,默认是false,不插入]
  6. multi:如果有多个符合条件的记录,是否全部更新,取值为01[mongodb 默认是false,只更新找到的第一条记录]
  7. 注意:默认情况下,只会更新第一个符合条件的记录
  8. 一般情况下后两个参数分别为0,1 ,即:
  9. db.collection.update(criteria,objNew,0,1)

使用正则表达式的替换操作:

  1. db.user.find().forEach( 
  2. function(u) {
  3.     u.site= u.site.replace(/\./, "-"); 
  4. db.user.save(u); 
  5. } 
  6. );

参考来源: http://www.runoob.com/mongodb/mongodb-regular-expression.html
参考来源: http://www.jb51.net/article/73958.htm
原创粉丝点击