我使用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.55
的IP 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
查詢中應該給出什麼樣的語法或正則表達式來實現這一點?
它的工作對我的問題完美:) –