2017-05-05 4 views
4

タイトルが多分不十分です。ここで説明しましょう。文書内の2つのフィールドを使用するクエリの書き方

は私がこのデータベースの構造が合理的ではないことを承知していますが、私はちょうど最短の方法で私の問題を表示したい

​​

としてデータベース構造を持っていると仮定します。

locationにはnameフィールド値が含まれています。ここではuniversity-alexにはalexが含まれているため、クエリの結果として返されます。

私はこれまで何をしましたか? このクエリを書きましたが、結果を取得できませんでした。

db.collection.find({location: {$regex: "$name"}}) 

どのように編集できますか?

+0

https://stackoverflow.com/questions/40984829/in-mongodb-how-to-perform-query-based-on-if-one-string-field-contains-anotherの可能な部分 – JohnnyHK

答えて

0

あなたが達成しようとしていることは、$where演算子で行うことができると思います。 this part of the documentation

db.collection.find({ $where: function() { 
    return (this.location.includes(this.name)); 
} }); 

それとも、単にfindメソッドにJS式を渡すことができますによると :

db.collection.find(function() { 
    return (this.location.includes(this.name)); 
}); 

はそれが役に立てば幸い、
よろしく

0

@boehm_sの一部は、それはの答え実行可能で非常に明確で、必要なものを見つけるために使用できる複数のフィールドインデックスを作成することもできます。この種の索引は、問合せの統合アプローチを実行する場合に非常に便利です。渡されたパラメータがその内容と一致するか、それらに含まれている場合は、複数のフィールドを参照してください。stringText Indexesに関するこのドキュメントページをご覧ください。 Mongooseを使用しているかどうかわかりませんが、this answerが役に立つかもしれません。

私のこのアプローチは、あなたが探している "単語"の一方または両方のフィールドにすべてのドキュメントを返すという事実に注意してください。あなたのフィールドにインデックスを作成

db.collection.createIndex(
    { 
    name: "text", 
    location: "text" 
    } 
) 

そして、あなたはノードウェイ

. . . 

let userProjection = { 
    "name": 1, 
    "age": 1, 
    "location": 1 
}; 

/** 
* @param req Contains information to find a user 
* @param req.findMe Contains name concatenated to location 
*/ 
let findUsers = (req) => { 
    letUsers = db.collection('users'); 
    return new Promise((resolve, reject) => { 
     User.findOne({'txtIndex': params.body.findMe}, {fields: userProjection},(err, user) => { 
      if (err) { 
       return reject({message: 'MongoDB Error', err: err}); 
      } 
      if (!user) { 
       return reject({message: 'User not found!'}); 
      } 
       return resolve(user); 
     }); 

    }); 
} 
ため

Mongoのドライバを行うことができます、あなたがこのインデックスtxtIndexを命名しましたとしましょう

マングースウェイ

let Users = require('./users-model.js); 

/** 
    * @param req Contains information to find a user 
    * @param req.findMe Contains name concatenated to location 
    */ 
let findUsers = (req) => { 
    Users.findOne({txtIndex: req.body.FindMe}).then(function (err, user) { 
     if (err) { 
      return reject({message: 'MongoDB Error', err: err}); 
     } 
     if (!user) { 
      return reject({message: 'User not found!'}); 
     } 
      return resolve(user); 
    });  

} 
関連する問題