2017-03-01 69 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? 所以我的文檔可能有這樣的URI /api/v.*/users/.*/profile ,然後像做db.apis.find( 「URI」:「/ API/V2 /用戶/ 12312341/profile「) – TheJason

+0

我沒有看到你想要做什麼,你不想在特定的url模式下尋找一個userId匹配嗎? –

+0

嗯,這是我的問題..我試圖自動化一個相當大的API網絡(3500多個不同的URI)。所以我永遠不會知道URI中的哪個塊是靜態的或動態的。 我有我的集合中的每個URI的文檔,其中包含路由信息,什麼不是。 – TheJason