我使用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查询中提供什么样的语法或正则表达式?
发布于 2015-05-20 20:16:10
作为一种regex模式,pymongo接受常规的Python regex object。因此,您可以进行以下操作:
import re
regex = re.compile('{}'.format(YOUR_IP_ADDR))
count = my_collection.find({'ip_addr_field': regex}).count()https://stackoverflow.com/questions/30357932
复制相似问题