5

クエリ文字列を使用してユーザー リポジトリを検索したいと考えています。

これにより、同様のユーザー名「kyogron」と同様の電子メール「kyogron@gmail」を持つすべてのユーザーが返されます。

GET localhost:3000/users?username=kyogron&email=kyogron@gmail.com

これにより、すべてのユーザーが返されます。

GET localhost:3000/users

すでにルーティング パラメータを処理できましたが、最適化に行き詰まっています。

app.get('/users', function(req, res) {
    // creates a mongoosejs query object
    var query = User.find({});

    // to understand how expressjs handles queries:
    // ?username=kyogron&email=kyogron@gmail.com
    // { username: "kyogron", email: "kyogron@gmail.com" }
    //console.log(req.query);

    // this was one idea of optimizing the search query parameters
    // this doesn't work don't know why I always get an array of ALL users
    // even the key and value is right
    Object.keys(req.query).forEach(function(key) {
        query.select(key, req.query[key]);
    });

    // this was the way I was first handling the parameters, this works !!
    //if (req.query.username) query.where('username', req.query.username);
    //if (req.query.email) query.where('email', req.query.email);

    // the rest of the query
    query.select('username', 'email');
    query.exec(function(err, users) {
        if (err) throw err;
        res.json(users);
    });

});

これらは私が戦っている問題です:

  1. req.query オブジェクトの繰り返しが機能しないのはなぜですか?
  2. マングースにワイルドカードを使うにはどうすればいいですか (例: kyo*)

誰かが私を助けてくれるといいですね:)

よろしく

編集

2 番目の問題は $where で解決できます。

    if (req.query.username) {
        query.$where(function() {
            return this.username === req.query.username; // here we need a regex check
        });
    }

それはうまくいきません...誰かが私にヒントを与えることができますか?

EDIT2:

$whereで何も管理していませんでした...しかし、私は今見つけました

query.where('username').regex();

同様の単語を探す検索正規表現を探すだけです

EDIT3:

私はこのスレッドを見つけました: "like" で MongoDB を照会する方法は? mongoosejsグループで、mongooseでこれを行う方法を尋ねます

EDIT4:

if (req.query.username) {
            query.where('username').regex(new RegExp("\/"+req.query.username+"\/"));
}

私はほとんどそれを手に入れました。このばかげた正規表現を修正する必要があります...

4

1 に答える 1

1
app.get('/users', function(req, res) {
    var query = User.find({});

    Object.keys(req.query).forEach(function(key) {
        query.where(key).regex(new RegExp(req.query[key]));
    });

    /*
    if (req.query.username) {
        query.where('username').regex(new RegExp(req.query.username));
    }
    if (req.query.email) {
        query.where('email').regex(new RegExp(req.query.email));
    }*/

    query.select('username', 'email');
    query.exec(function(err, users) {
        if (err) throw err;
        res.json(users);
    });

});

タイプミス(.select()ではなく.where())があったため、最初の機能は機能しませんでした。2番目は余分なスレッドで見つかりました

選択したアプローチについてはまだ少しわかりません。

req.queryを繰り返すことで、コードを再利用可能にすることができます(おそらく、前提条件のルーティングパラメーター関数として)が、エラーの影響を非常に受けやすくなります。

于 2012-07-23T12:40:18.400 に答える