2017-03-01 45 views
0

このURIのコレクションと、URIとhttpMethodを渡す機能を作成しました。これはMongoDBクエリを作成して一致する文書を検索します。キャッチは、URIはそれらの動的要素を持つことができるということです...ので、のように:MongoDB条件との完全一致

/api/v1/users/{userid}/profile 

しかし、また、このようなURIがあることができます:

/api/vi/users/all/ 

私は、収集に私のURIをブロックアウトだから私はこのMongoの質問を書いた:

db.apis.aggregate({ 
    "$match" : { 
     "$and" : [ 
      {"$or" : [{"_uri_.blocks.block" : "api","_uri_.blocks.position" : {"$eq" : 1.0}},{"_uri_.blocks.isWild" : true,"_uri_.blocks.position" : {"$eq" : 1.0}}]}, 
      {"$or" : [{"_uri_.blocks.block" : "v1","_uri_.blocks.position" : {"$eq" : 2.0}},{"_uri_.blocks.isWild" : true,"_uri_.blocks.position" : {"$eq" : 2.0}}]}, 
      {"$or" : [{"_uri_.blocks.block" : "users","_uri_.blocks.position" : {"$eq" : 3.0}},{"_uri_.blocks.isWild" : true,"_uri_.blocks.position" : {"$eq" : 3.0}}]}, 
      {"$or" : [{"_uri_.blocks.block" : "{userid}","_uri_.blocks.position" : {"$eq" : 4.0}},{"_uri_.blocks.isWild" : true,"_uri_.blocks.position" : {"$eq" : 4.0}}]}, 
      {"$or" : [{"_uri_.blocks.block" : "profile","_uri_.blocks.position" : {"$eq" : 5.0}},{"_uri_.blocks.isWild" : true,"_uri_.blocks.position" : {"$eq" : 5.0}}]}, 
      {"_canonical_._httpMethod_":"POST"} 
     ] 
    } 
}, 
    {"$limit" : 1.0}) 

しかし、それは私が望んでいたように完全に一致するようには見えない。

最も正確な文書のみを返すようにMongoに問い合わせる方法に関する提案はありますか?

答えて

0

次の入力取って、パターンに一致する$regexを使用することができます。

db.apis.insert([{ 
    "uri": "/api/v1/users/someUser/profile" 
}, { 
    "uri": "/api/v2/users/otherUser/profile" 
}, { 
    "uri": "/api/v2/users/otherUser/login" 
}, { 
    "uri": "/api/v1/users/someUser/login" 
}, { 
    "uri": "/api/v1/users/all/" 
}]) 
  • 試合/api/v{version}/users/{userId}/profile

    var userId = "someUser"; 
    var version = 1; 
    var limit = 1; 
    
    db.apis.find({ 
        "uri": { 
         $regex: '/api/v' + version + '/users/' + userId + '/profile' 
        } 
    }).limit(limit) 
    
  • 試合/api/v{version}/*

    var version = 1; 
    var limit = 10; 
    
    db.apis.find({ 
        "uri": { 
         $regex: '/api/v' + version + '/.*' 
        } 
    }).limit(limit) 
    
+0

正規表現のURIをドキュメントに追加すると、そこからURIを検索することはできますか? は、だから私の文書が /api/v.*/users/.*/profile URI のためにこれを持っているかもしれませんし、その後( "URI" db.apis.findような何かを: "/ API/V2 /ユーザー/ 12312341/profile ") – TheJason

+0

あなたは何をしようとしているのかわかりませんが、特定のURLパターンで一致するuserIdを探してみませんか? –

+0

これは私の問題です。私はかなり大きなAPIネットワーク(3500以上の異なるURI)を自動化しようとしています。だから、私は決してURIのどのブロックが静的か動的か分からないでしょう。 コレクションのURIごとにルーティング情報が含まれている文書とそうでないものがあります。 – TheJason

関連する問題