2015-01-02 23 views
2

給定像{ name: String, middlename: String, lastname: String }這樣的結構在mongo中有兩種方法可以在節點和php中搜索字段級聯中的術語,例如在mysql中我可以這樣做MongoDB(Mongoose和Mongo客戶端PHP)在concat字段中搜索

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

這樣我不需要明確地進行輸入,每場只有一個,但我沒有看到如何完成這樣的事情在蒙戈

回答

3

可以在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); 
}}) 

或者,您可以彙總結果。

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}} 
]) 

這兩種方法中的任何一種都可以,因爲這兩種方法es不能使用集合上的任何索引。

+1

只要'返回!!(matchA || matchB)'就夠了。 – thefourtheye

+0

@thefourtheye - 謝謝你指出。現在代碼看起來更乾淨。 – BatScream