2015-05-20 65 views
1

我使用MongoDB中存儲我的數據,我用下面的python腳本執行查詢找到一個集合的計數,檢索從pymongo MongoDB的IP地址數據

collection_name = "prodresultlistCollection_%s_%s" %(sys.argv[1], sys.argv[2]) 
my_collection = mydb[collection_name] 

parameter = "IP addr" 
ip = "10.20.30.40" 
count1 = my_collection.count({ '$and': [{parameter:'%s' %(ip)}]}) 

這裏count1顯示具有給定ip值的行數。這個count1查詢只計算ip == IP addr的行數。但在數據庫中的IP addr屬性可以有以下格式的一個或多個IP,

10.20.30.40 
10.20.30.40,20.35.45.55 
10.20.30.40,20.35.45.55,10.10.10.10 
etc... 

考慮在數據庫中的IP addr值是10.20.30.40,20.35.45.55,那麼無論的ip模式給出的查詢檢索應此行。

ip = 10 
ip = 10.20 
ip = 10.20.30 
ip = 10.20.30.40 
ip = 20 
ip = 20.35 
ip = 20.35.45 
ip = 20.35.45.55 

在給予count1查詢ip所有上述情況下,在與10.20.30.40,20.35.45.55IP addr值數據庫特定行應檢索。我試圖用下面給出的正則表達式來解決問題,但它顯示了pymongo中的語法錯誤,並且在某些情況下沒有檢索到行。

count1 = my_collection.count({ '$and': [{parameter:/'%s'/ %(ip)}]}) 
count1 = my_collection.count({ '$and': [{parameter:'/%s/' %(ip)}]}) 
count1 = my_collection.count({ '$and': [{parameter:/%s/ %(ip)}]}) 

然後我試圖使用正則表達式使用下面的代碼的IP模式相匹配:

import re 

IP = raw_input("Enter the IP: ") 
S = IP.split(".") 
IP_DB = "10.20.30.40,20.35.45.55" 

if len(S)==4: 
    obj = re.search(r"^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$",IP_DB) 
elif len(S)==3: 
    obj = re.search(r"^\d{1,3}\.\d{1,3}\.\d{1,3}",IP_DB) 
elif len(S)==2: 
    obj = re.search(r"^\d{1,3}\.\d{1,3}",IP_DB) 
elif len(S)==1: 
    obj = re.search(r"^\d{1,3}",IP_DB) 
else: 
    print "Invalid IP!!!" 

if obj: 
    print obj.group() 
else: 
    print "Nothing found!!!" 

但這裏的問題是,它只是比較IP的模式,而不是價值。對於xx.xx.xx.xx模式中給出的任何IP值,此代碼將返回true以進行匹配/搜索結果。此外,這裏不考慮知識產權的第二部分。有沒有更好的方法來解決這個問題?我需要使用ip從mongodb數據庫中檢索行,以便ip的任何模式與數據庫中的IP addr匹配。在count1查詢中應該給出什麼樣的語法或正則表達式來實現這一點?

回答

1

作爲regex模式,pymongo接受常規Python regex object。所以你可以做到以下幾點:

import re 

regex = re.compile('{}'.format(YOUR_IP_ADDR)) 

count = my_collection.find({'ip_addr_field': regex}).count() 
+0

它的工作對我的問題完美:) –