Mongo数据库:搜索转义某些字符的文本

时间:2016-03-03 12:13:41

标签: regex mongodb search find escaping

我正在寻找一种方法来搜索我的MongoDB上的文字,以逃避一些角色。

例如:

在集合contacts中有一个带有" john.doe"的文档。在字段name

{
  _id: ID
  ...
  name : "john.doe",
  ...
}

(" john.doe"可能是" j.ohndoe"或" johndoe"或" jo.hn.do.e&#34 ;,你的名字)

我想找到它来搜索" johndoe",不仅仅是" john.doe" (忽略"。")。直接使用findOne

会很棒

有办法做到这一点吗?

非常感谢:)

1 个答案:

答案 0 :(得分:0)

我认为使用纯粹的MongoDB查询是不可能的。但是,您可以使用MongoDB map reduce来获取过滤文档或在客户端执行此类操作。我知道这不是一个优雅的解决方案,但至少会起作用。

请参阅https://docs.mongodb.org/manual/core/map-reduce/

示例

function findByKey(key)
{
    var keys =
    db.contacts.mapReduce(function(){
        var re = /\./igm;
        var txt = this.name.replace(re,"");
        var re = new RegExp(u_name);

        if(re.exec(txt)!= null)
        {
            emit(1, this._id);
        }
    }, function(k, v){
        return {keys: v};
    }, 
    {
        out:{inline:true}, 
        scope: {u_name:key}
    });

    if(keys.results.length > 0)
    {
        var arKeys = keys.results[0].value.keys;
        return db.contacts.find({_id:{$in: arKeys}});
    }
    else
    {
      return null;
    }
};

var data = findByKey("john doe");

在运行上面的脚本之后,可变数据将保存所有包含" john doe"包括j.ohn.doejohn.doe,因此忽略所有时段。