猫鼬查询正则表达式以忽略中间字符
Posted
技术标签:
【中文标题】猫鼬查询正则表达式以忽略中间字符【英文标题】:mongoose query regex to ignore middle character 【发布时间】:2020-06-22 04:43:30 【问题描述】:我正在使用 mongodb,我的数据存储为 day:"3/6/2020" 我想查询与 day:"3/2020" 匹配的字符串 strong> 没有中间值或省略 day:"3/6/2020" 中的 6。 比如
`myModel.find("day": $regex: "3/2020", $options:" what option to pass here to ignore the `
` middle value");`
or any better way
`model.find("name": $regex: search, $options:" regex options", (err, users)=> `
` res.status(200).send(users);`
"3/2020" 将任何记录与 3 和 2020 匹配,就像此 "3/2020" 与 匹配一样“2020 年 3 月 6 日”
【问题讨论】:
【参考方案1】:我想您可以使用聚合框架将字符串日期转换为正确的日期,获取月份和年份并正确匹配。像这样的
model.aggregate([
"$addFields":
"convertedDate":
"$toDate": "$myDate" // mydate is your field name which has string
,
"$addFields":
"month":
"$month": "$convertedDate"
,
"year":
"$year": "$convertedDate"
,
"$match":
"month": 3, // this is your search criteria
"year": 2020 // // this is your search criteria
,
"$project":
"month": 0, // Do not take temp added fields month and year
"year": 0 // Do not take temp added fields month and year
])
这可能看起来像一个大查询,但我想这比使用正则表达式进行字符串合并要好得多。如果您的字段以日期格式保存,您还可以删除您正在执行$toDate
的第一阶段。希望这会有所帮助
【讨论】:
谢谢你,如果你能参考我更多的例子来符合我的理解,我将不胜感激。 阅读 - docs.mongodb.com/manual/core/aggregation-pipeline docs.mongodb.com/manual/reference/operator/aggregation/… docs.mongodb.com/manual/reference/operator/aggregation/toDate docs.mongodb.com/manual/reference/operator/aggregation/month 我想这应该对你有所帮助【参考方案2】:这可能会对你有所帮助。我们匹配 3,而不是一个或两个字符宽的数字,然后在 2020 年底。
3\/\d1,2\/2020
https://regex101.com/r/jn4zwa/1
【讨论】:
model.find("name": $regex: search, $options:" /\d1,2\"
不锻炼。
为什么要搜索 \d1,2?搜索我提供给您的正则表达式:3\/\d1,2\/2020
对上面的内容很抱歉,我从上面复制了它.. 下面是我的代码 `let yearString = req.body.year.toString();` ` let monthString = req.body.month.toString ();` `console.log('fire etting...', queryDate);` ` await FruitModel.find("day": $regex:`queryDate,$options:"/\d1,2", (err, records)=>
`console.log(records);` res.status(200).send(msg:"successs", record:records);`)
monthString +'\/'+'\d1,2'+'\/'+yearString;可能发生的第一个错误。
你熟悉正则表达式中的转义吗?【参考方案3】:
Solved. i solved it splitting my date as in my schema
```
qDay :
type:Number, default: new Date().getDate(Date.now)
,
qMonth :
type:Number, default: new Date().getMonth(Date.now) + 1
,
qYear :
type:Number, default: new Date().getFullYear(Date.now)
```
my query
```const getByDay = async (req, res)=>
console.log(req.body);
merchantModel.find($and:[qMonth : req.body.month
,qYear: req.body.year,qDay:req.body.day]).then((record)=>
if(record.length == 0)
res.status(404).send(msg:'no record!');
else
co`enter code here`nsole.log(record);
res.status(200).send(record:record);
);
```
【讨论】:
以上是关于猫鼬查询正则表达式以忽略中间字符的主要内容,如果未能解决你的问题,请参考以下文章
求一个匹配 以指定字符开头,指定字符结尾,中间内容任意的正则表达式
求一个匹配 以指定字符开头,指定字符结尾,中间内容任意的正则表达式
求一个匹配 以指定字符开头,指定字符结尾,中间内容任意的正则表达式