2017-10-05 2 views
2

Ich verwende node-mongodb-native, um MongoDB Abfragefunktionen zu implementieren. Ich brauche eine Abfrage durchführen, wenn tag einen Teil oder kombiniert firstName und lastName wie diese Spiele:node.js - RegExp in mongodb native

filter50WithTagSkip(tag, skip) { 
     return new Promise((resolve, reject) => { 
      const regex = new RegExp(tag, 'g'); 
      const or_criteria = [ 
       { firstName: { $regex: regex, $options: 'i' } }, 
       { lastName: { $regex: regex, $options: 'i' } }, 
       { fullName: { $regex: regex, $options: 'i' } }, 
       { email: { $regex: regex, $options: 'i' } }, 
       { phone: { $regex: regex, $options: 'i' } } 
      ]; 
      this._db.collection(this._table) 
       .aggregate({ 
        $project: { 
         deleted: 1, 
         firstName: 1, 
         lastName: 1, 
         email: 1, 
         phone: 1, 
         fullName: { $concat: ['$firstName', ' ', '$lastName'] } 
        } 
       }).match({ 
        $or: or_criteria, 
        deleted: false 
       }) 
       .skip(skip) 
       .limit(50) 
       .toArray((err, res) => { 
        if (err) { 
         this._logger.error(err); 
         reject(err); 
        } else { 
         resolve(res); 
        } 
       }); 
     }); 
    } 

Mit diesen Proben:

{ 
firstName: "first1", 
lastName: "last1" 
}, 
{ 
firstName: "first2", 
lastName: "last2" 
} 

Wenn tag ist first das Ergebnis beiden Dokumente hat. Aber wenn ich firstName und lastName Kriterien auskommentieren, denke, dass sie nicht benötigt werden, weil RegExp Muster auf die kombinierte Zeichenfolge anwenden wird, ist das Ergebnis ein leeres Array. Ich fühle mich ziemlich verwirrt

Antwort

0

Ich glaube, ich die Lösung selbst gefunden, das ist der richtige Weg, um eine aggregierte Abfrage dieser Bibliothek zu initialisieren:

filter50WithTagSkip(tag, skip) { 
     return new Promise((resolve, reject) => { 
      const regex = new RegExp(tag, 'g'); 
      const or_criteria = [ 
       // { firstName: { $regex: regex, $options: 'i' } }, 
       // { lastName: { $regex: regex, $options: 'i' } }, 
       { fullName: { $regex: regex, $options: 'i' } }, 
       { email: { $regex: regex, $options: 'i' } }, 
       { phone: { $regex: regex, $options: 'i' } } 
      ]; 
      const project_criteria = { 
       deleted: 1, 
       // firstName: 1, 
       // lastName: 1, 
       email: 1, 
       phone: 1, 
       fullName: { $concat: ['$firstName', ' ', '$lastName'] } 
      }; 
      const match_criteria = { 
       $or: or_criteria, 
       deleted: false 
      }; 
      const aggregate_criteria = [{ $project: project_criteria }, { $match: match_criteria }]; 
      this._db.collection(this._table) 
       .aggregate(aggregate_criteria) 
       .skip(skip) 
       .limit(50) 
       .toArray((err, res) => { 
        if (err) { 
         this._logger.error(err); 
         reject(err); 
        } else { 
         resolve(res); 
        } 
       }); 
     }); 
    }