2014-07-09 7 views

Odpowiedz

13

można tylko zrobić to z ram agregacji, nie z regularnym znalezieniem.

db.coll.aggregate({$project:{newField:{$concat:["$field1","$field2"]}}}, 
        {$match:{newField:"value"}} 
); 

pamiętać, że nie będą mogli używać żadnych indeksów, ponieważ nie ma wsparcia dla indeksów obliczanych wartości w MongoDB (jeszcze).

Jeśli indeks na field1 i wiesz, ile znaków można oczekiwać pole1 przyczynić się do value można zwiększyć wydajność tego agregacji jak ten:

db.coll.aggregate({$match:{field1:/^val/}}, 
        {$project:{newField:{$concat:["$field1","$field2"]}}}, 
        {$match:{newField:"value"}} 
); 

gdzie val to pierwsza część „wartość” ciąg (nie należy porównać więcej znaków niż najkrótszej możliwej wartości field1 chociaż.

EDIT od wersji 3.6 można to zrobić w znalezisku pomocą $expr Wyrażenie:

db.coll.find({$expr:{$eq:["value", {$concat:["$field1", "$field2"]}]}}) 
+1

Awesome, to jest prawie to, czego potrzebuję: sprawdź mój zmienił, w jaki sposób można włączyć dopasowanie $ do "in (array)"? – Deleteman

+2

nvm, znalazłem operatora $ in! – Deleteman

+0

Łańcuch w agregacie mongodb jest tam, gdzie jest! – Rohmer

4

Jeśli argument ($ pole1 lub $ pole2) postanawia o wartości null lub odnosi się do dziedziny, która jest niekompletna, $ concat zwraca null. Od mongoDB3.0 nowy $ IFNULL służy do sprawdzenia, czy argument jest nieważne i stanowić alternatywę

{ $ifNull: [ <expression>, <replacement-expression-if-null> ] } 

db.coll.aggregate({$project:{newField:{$concat:[{$ifNull:["$field1",""]},{$ifNull:["$field2",""]}]}}}, 
       {$match:{newField:"value"}}) 

Wyniki mogą się różnić, jeśli nie używamy $ mecz, ale wyniki będą się różnić, jeśli chcesz użyj $ regex.

0

W Mongoose można lubię tego

let clause = [            
      {$project:{name:{$concat["$first_name"," ","$last_name"]}}}, 
      {$match:{name:new RegExp("ab", 'i')}}      
     ];                    
Model.aggregate(clause) 

wyjście będzie tak

[ 
{ 
    "_id": "5911db2b9235272052fdd2e1", 
    "name": "Ali Abbas" 
}, 
{ 
    "_id": "5912f7dd8bdbc24aa37b5239", 
    "name": "Ali Abad" 
}, 
{ 
    "_id": "59229e0322abdb311818e419", 
    "name": "Syed Ali Abbas Shah" 
}, 
{ 
    "_id": "592837da188fa969cc135ddc", 
    "name": "Abu Akbar" 
} 

]

Powiązane problemy