node mysql 模糊查询_nodejs + mongodb实现模糊查询与全文搜索

mongodb中的查询条件

关键字说明

$or

或关系

$nor

或关系取反

$gt

大于

$gte

大于等于

$lt

小于

$lte

小于等于

$ne

不等于

$in

在多个值范围内

$nin

不在多个值范围内

$all

匹配数组中多个值

$regex

正则,用于模糊查询

$size

匹配数组大小

$maxDistance

范围查询,距离(基于LBS)

$mod

取模运算

$near

邻域查询,查询附近的位置(基于LBS)

$exists

字段是否存在

$elemMatch

匹配内数组内的元素

$within

范围查询(基于LBS)

$box

范围查询,矩形范围

$center

范围查询,圆形范围

$centerSphere

范围查询,球形范围

$slice

查询字段集合中的元素(比如从第几个之后,第N到第M个元素)

mongodb中的查询语句

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

db.collection.find( { field: { $regex: ‘acme.*corp‘, $options: ‘i‘ } } );

官方举例是通过 ‘/.../‘ 和$regex,这两种都可以查询到结果。

现在我想实现查询标题关键字匹配到对应文章。

如下:

1.查询title字段中包含某个字符串的集合:

Article.find({"title":{$regex: /searchValue/,$options:‘i‘}}, (err, data) => { //{"title": /searchValue/} $options:‘i‘ 表示忽略大小写

if(err) {

console.log(err)return res.status(500).json({

result:1,

error_info: err.message

})

}

console.log(data)

let length=data.lengthreturn res.status(200).json({

result:0,

count: length,

searchArticle: data

})

})

searchValue是前端传过来的查询关键词。

这么写好像没有问题,跟官方实例一样,但是查询不到结果。

请注意,MongoDB的的模糊查询是通过正则表达式实现的,对应mongodb中,可以直接使用 ‘/../’ 斜杠。

但是在nodejs中,必须要使用RegExp,来构建正则表达式对象。

router.post(‘/like_article_search‘, (req,res) =>{

let searchValue=req.body.value

console.log(searchValue)var str=".*"+searchValue+".*$"

var reg = newRegExp(str)

Article.find({"title":{$regex:reg,$options: ‘i‘}}, (err, data) => { //$options:‘i‘ 表示忽略大小写

if(err) {

console.log(err)return res.status(500).json({

result:1,

error_info: err.message

})

}

console.log(data)

let length=data.lengthreturn res.status(200).json({

result:0,

count: length,

searchArticle: data

})

})

})

这样就可以匹配到查询结果。

2.查询以某个字母开头的集合

mongodb语法:

db.UserInfo.find({userName :/^A/})

nodejs中写法:

router.post(‘/like_article_search‘, (req,res) =>{

let searchValue=req.body.value

console.log(searchValue)var str="^.*"+searchValue+".*$"

var reg = newRegExp(str)

Article.find({"title":{$regex:reg,$options: ‘i‘}}, (err, data) => { //{"title": /searchValue/} $options:‘i‘ 表示忽略大小写

if(err) {

console.log(err)return res.status(500).json({

result:1,

error_info: err.message

})

}

console.log(data)

let length=data.lengthreturn res.status(200).json({

result:0,

count: length,

searchArticle: data

})

})

})

3.多条件模糊查询

使用$or 语法。

多字段匹配,title、categroy、lable中包含查询关键词的都进行匹配

//模糊查询

router.post(‘/like_article_search‘, (req,res) =>{

let searchValue=req.body.value//console.log(searchValue)

//var str=".*"+searchValue+".*$"

//var reg = new RegExp(str)

var reg = newRegExp(searchValue);var _filter ={//多字段匹配

$or: [

{‘title‘: {$regex: reg}},

{‘categroy‘: {$regex: reg}},

{‘lable‘: {$regex: reg}},

]

}

Article.find(_filter, (err, data)=> { //{"title": /searchValue/} $options:‘i‘ 表示忽略大小写

if(err) {

console.log(err)return res.status(500).json({

result:1,

error_info: err.message

})

}

console.log(data)

let length=data.lengthreturn res.status(200).json({

result:0,

count: length,

searchArticle: data

})

})

})

这样就可以实现。还可以通过某个字段对搜索结果进行降序或升序排列。

原文:https://www.cnblogs.com/lyt0207/p/13260055.html

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值