我正在使用mongodb来存储我的数据,我习惯使用python脚本执行查询来查找集合的数量,
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
在ip
查询count1
的所有上述情况中,应检索IP addr
值为10.20.30.40,20.35.45.55
的数据库中的特定行。我尝试使用正则表达式解决问题,如下所示,但它在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的第二部分。有没有更好的方法来解决这个问题?我需要使用ip
从mongodb数据库中检索行,这样任何给定的ip
模式都匹配数据库中的IP addr
。在count1
查询中应该给出什么样的语法或正则表达式才能实现这一点?
答案 0 :(得分:1)
作为regex
模式,pymongo接受常规Python regex object
。所以你可以做到以下几点:
import re
regex = re.compile('{}'.format(YOUR_IP_ADDR))
count = my_collection.find({'ip_addr_field': regex}).count()