Nodejs对MongoDB模糊查询

从零开始nodejs系列文章

从零开始nodejs系列文章,将介绍如何利Javascript做为服务端脚本,通过Nodejs框架web开发。Nodejs框架是基于V8的引擎,是目前速度最快的Javascript引擎。chrome浏览器就基于V8,同时打开20-30个网页都很流畅。Nodejs标准的web开发框架Express,可以帮助我们迅速建立web站点,比起PHP的开发效率更高,而且学习曲线更低。非常适合小型网站,个性化网站,我们自己的Geek网站!!

关于作者
张丹(Conan), 程序员Java,R,PHP,Javascript
weibo:@Conan_Z
blog: http://blog.fens.me
email: bsspirit@gmail.com

转载请注明出处:
http://blog.fens.me/nodejs-mongodb-regexp

reg-title

前言

模糊查询是数据库的基本操作之一,实现对给定的字符串是否与指定的模式进行匹配。如果字符完全匹配,可以用=等号表示,如果部分匹配可认为是一种模糊查询。在关系型数据中,通过SQL使用like ‘%fens%’的语法。那么在mongodb中我们应该如何实现模糊查询的效果呢。

目录

  1. mongodb模糊查询
  2. nodejs通过mongoose的模糊查询

1. mongodb模糊查询

我们打开mongodb,以name文字字段进行测试。

精确查询
当{‘name’:’未来警察’}时,精确匹配到一条记录。


db.movies.find({'name':'未来警察'})

reg

模糊查询
{‘name’:/未来/},匹配到了多条记录。


db.movies.find({'name':/未来/})

reg2

MongoDB的模糊查询,其实是正则查询的一种。
注:在关系型数据中,单独有一个关键字like做模糊查询,如果不用like,也可以在关系型数据中使用正则查询。

MongoDB官方介绍:http://docs.mongodb.org/manual/reference/operator/regex/

官方举例:
db.collection.find( { field: /acme.*corp/i } );
db.collection.find( { field: { $regex: 'acme.*corp', $options: 'i' } } );

2. nodejs通过mongoose的模糊查询

希望实现的效果:
reg3

下面说说如何用mongoose进行模糊查询。

使用mongoose访问mongodb,在 Mongoose使用案例–让JSON数据直接入库MongoDB 一文中已经讲过。

我们对Movie建模,并构造dao层。

查询所有电影


MovieDAO.prototype.findByName = function(query, callback) {
  Movie.findOne(query, function(err, obj){
    callback(err, obj);
  });
};

通过传入query对象,就可以进行查询。

接下来,构造query对象


//代码片断
exports.movie = function(req, res) {
  var query={};
  if(req.query.m2) {
    query['name']=new RegExp(req.query.m2);//模糊查询参数
  }

  Movie.findByName (query,function(err, list){
    return res.render('admin/movie', {movieList:list});
  });
}

请注意,刚才我们已经分析了MongoDB的的模糊查询是通过正则表达式实现的,对应mongodb中,可以直接使用 ‘/../’ 斜杠。
但是在nodejs中,必须要使用RegExp,来构建正则表达式对象。

其实很简单,一层窗户纸。知道了实现原理,一切都变得很容易。

转载请注明出处:
http://blog.fens.me/nodejs-mongodb-regexp

打赏作者

This entry was posted in Javascript语言实践, 数据库

0 0 votes
Article Rating
Subscribe
Notify of
guest

This site uses Akismet to reduce spam. Learn how your comment data is processed.

12 Comments
Oldest
Newest Most Voted
Inline Feedbacks
View all comments
nihao

你好 ,为什么我的查不出来数据,数据库里有内容啊

Conan Zhang

先查一下全局看看
db.movies.find();

另外,检查一下你的数据,是否有空格之类的字符,用正则查询再试一下。
db.movies.find({‘name’:/未来/})

nihao

全局数据是有的,有一条 name:’a’ 这条数据可以查出来,

有多条 name:’未来警察’ 查的时候会显示 buffer too small

是不是我哪里设置有问题

Conan Zhang

我不知道这是什么问题,你重装一下mongodb,再试试吧。

nihao

谢谢你这么耐心的指导

nicholas_xue

哈哈,果然是写java的 造了一个dao层。支持楼主,看过好多node的文章,楼主写的很好。

Conan Zhang

JAVA的很多设计模式和思想,对其他语言都影响深远。

gaoyw

用正则查询的话,支持索引么

Conan Zhang

支持索引,但你需要手动优化。比如:
1. 从开始匹配 ^
2. 指定hint

http://stackoverflow.com/questions/17942275/speed-up-regex-string-search-in-mongodb

mokingone

丹哥好,mongodb 模糊查询,用ejs,在前端展现 查出来的数据,日期类型的数据展示如下格式:Thu Apr 29 2010 08:00:00 GMT+0800 (中国标准时间) 怎么转换,我看了ejs的文档 用
Filter 但是我发现我的filter都用不了,不管是自定义的还是ejs自带的都不能用 我想问问用filter有什么特殊的配置?

Conan Zhang

我用moment处理日期,你试一下很好用的。http://momentjs.com/

mokingone

谢谢。

12
0
Would love your thoughts, please comment.x
()
x