Учитывая структуру как { name: String, middlename: String, lastname: String }
есть ли в mongo и mongoose для узла, и в 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
Таким образом, мне не нужно явно вводить данные для каждого поля, только одно, но я не вижу, как сделать что-то подобное в Монго
Вы можете использовать $, где оператор в find()
запрос:
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 с Монго.)Трубопровод агрегации 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}}
])
Достигнуть любого из подходов здесь было бы хорошо, поскольку оба подхода не могут использовать какие-либо индексы в коллекции.
Других решений пока нет …