Mongodb查询问题,如何获取$or运算符的匹配项

Posted

技术标签:

【中文标题】Mongodb查询问题,如何获取$or运算符的匹配项【英文标题】:Mongodb query problem, how to get the matching items of the $or operator 【发布时间】:2021-01-09 07:29:48 【问题描述】:

首先谢谢你。

MongoDB 版本:4.2.11

我有这样一条数据:


 "name":...,
 ...
 "administration" : [
    "name":...,"job":...,
    "name":...,"job":...
  ],
 "shareholder" : [
    "name":...,"proportion":...,
    "name":...,"proportion":...,
  ]

我想通过正则表达式匹配一些指定的数据: 例如:

db.collection.aggregate([
  "$match" : 
   
     "$or" : 
     [
       "name" : "$regex": "Keyword"
       "administration.name": "$regex": "Keyword",
       "shareholder.name": "$regex": "Keyword",
     ]
   
  ,
])

我想在 $or 运算符成功匹配任何条件时设置一个标志,由自定义字段表示,例如:"name" : "$regex": "Keyword"成功时执行:

"$project" : 
        
            "_id":false,
            "name" : true,
            "__regex_type__" : "name"
        
    ,

"administration.name" : "$regex": "Keyword"成功时执行:"__regex_type__" : "administration.name"

我尝试这样做:

"$project" : 
            
                "_id":false,
                "name" : true,
                "__regex_type__" : 
                
                   "$switch":
                        
                            "branches":
                            [
                              "case": "$regexMatch":"input":"$name","regex": "Keyword","then" : "name",
                              "case": "$regexMatch":"input":"$administration.name","regex": "Keyword","then" : "administration.name",
                              "case": "$regexMatch":"input":"$shareholder.name","regex": "Keyword","then" : "shareholder.name",
                            ],
                            "default" : "Other matches"
                        
                
            
        ,

但是$regexMatch无法匹配数组,我再次尝试使用$unwind,但是返回了很多数组成员的个数,不符合我的出发点。

我想在mongodb中实现这个sql语句和mysql一样的功能,像这样:

SELECT name,administration.name,shareholder.name,(
 CASE
 WHEN name REGEXP("Keyword") THEN "name"
 WHEN administration.name REGEXP("Keyword") THEN "administration.name"
 WHEN shareholder.name REGEXP("Keyword") THEN "shareholder.name"
 END
)AS __regex_type__ FROM db.mytable WHERE 
  name REGEXP("Keyword") OR
  shareholder.name REGEXP("Keyword") OR
  administration.name REGEXP("Keyword");

也许这种方法很愚蠢,但我没有更好的解决方案。

如果您有更好的解决方案,我将不胜感激!!! 谢谢!!!

【问题讨论】:

【参考方案1】:

由于 $regexMatch 不处理数组,使用 $filter 过滤单个数组元素和 $regexMatch,然后使用 $size 查看有多少元素匹配。

["$match"=>"$or"=>["a"=>"test", "arr.a"=>"test"],
 "$project"=>
   "a"=>1,
    "arr"=>1,
    "src"=>
     "$switch"=>
       "branches"=>
         ["case"=>"$regexMatch"=>"input"=>"$a", "regex"=>"test",
           "then"=>"a",
          "case"=>
            "$gte"=>
              ["$size"=>
                 "$filter"=>
                   "input"=>"$arr.a",
                    "cond"=>
                     "$regexMatch"=>"input"=>"$$this", "regex"=>"test",
               1],
           "then"=>"arr.a"],
        "default"=>"def"]
["_id"=>BSON::ObjectId('5ffb2df748966813f82f15ad'), "a"=>"test", "src"=>"a",
 "_id"=>BSON::ObjectId('5ffb2df748966813f82f15ae'),
  "arr"=>["a"=>"test"],
  "src"=>"arr.a"]

【讨论】:

以上是关于Mongodb查询问题,如何获取$or运算符的匹配项的主要内容,如果未能解决你的问题,请参考以下文章

mongodb 在节点中使用 mongoose 想要在查询中使用 or 和

nodejs + mongodb实现模糊查询与全文搜索

Mongodb:在 find() 中使用 $or 时返回匹配的过滤器

Mongodb:在 find() 中使用 $or 时返回匹配的过滤器

MongoDB in Go (golang) with mgo:如何使用逻辑运算符进行查询?

如何在全文搜索中匹配三个值/关键字?