猫鼬查询正则表达式以忽略中间字符

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" 将任何记录与 32020 匹配,就像此 "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);
        
    );
```

【讨论】:

以上是关于猫鼬查询正则表达式以忽略中间字符的主要内容,如果未能解决你的问题,请参考以下文章

求一个匹配 以指定字符开头,指定字符结尾,中间内容任意的正则表达式

求一个匹配 以指定字符开头,指定字符结尾,中间内容任意的正则表达式

求一个匹配 以指定字符开头,指定字符结尾,中间内容任意的正则表达式

为啥在正则表达式中以某种方式忽略子后的第一个字符? [复制]

正则表达式:数字开头中间字母结尾数字

正则表达式:忽略字符串比较中的字符