MongoDB(Mongoose & Mongo Client PHP)在concat字段中搜索


MongoDB (Mongoose & Mongo Client PHP) search in concat field

给定一个像{ name: String, middlename: String, lastname: String }这样的结构,在 mongo 中是否有一种方法可以在 mongoe 中为 node 和 php 在字段的连接中搜索术语,例如在 mysql 中,我可以做类似的事情

select * from persons 
    where concat_ws(' ',name, middlename, lastname) like '%John A%' OR
    concat_ws(' ',lastname, middlename, name) like '%John A%'
    group by id

这样我就不需要为每个字段显式输入一个,但我看不到如何在 MONGO 中完成这样的事情

您可以在find()查询中使用 $where 运算符:

db.persons.find({$where:function(){
    var search = /John A/;
    var matchA = (this.name+" "+this.middlename+" "+this.lastname).match(search);
    var matchB = (this.lastname+" "+this.middlename+" "+this.name).match(search);
    return !!(matchA || matchB);
}})

或者,您可以聚合结果。

  • Project两个额外的字段,其中包含串联的值。(使用$concat运算符。
  • Match使用正则表达式模式。(SQL 到 Mongo 映射图表。

MongoDb 聚合管道:

var search = /John A/;
db.persons.aggregate([
{$project:{"concat_name_a":{$concat:["$name"," ","$middlename"," ","$lastname"]},
           "concat_name_b":{$concat:["$lastname"," ","$middlename"," ","$name"]},
           "name":1,"middlename":1,"lastname":1}},
{$match:{$or:[{"concat_name_a":search},{"concat_name_b":search}]}},
{$project:{"name":1,"middlename":1,"lastname":1}}
])

在这里选择其中任何一种方法都可以,因为这两种方法都不能使用集合上的任何索引。