2016-06-09 3 views
0

내가 작업하고있는 네트워크 보안 프로젝트의 경우 mongoDB 컬렉션의 내 국가 및 기타 관련 필드의 모든 IP 목록이 있습니다. 이처럼mongoDB mongoengine의 다중 필터

:

{ 
    "_id" : ObjectId("56674d3d9ee3d40b79167e09"), 
    "ip" : "200.6.116.75", 
    "server" : "Microsoft-IIS/7.5", 
    "date" : "2015-11-23" 
} 

것은 지금 내가 그들의 주어진 ASN (자율 시스템 번호)를 필터링 할 것입니다. 나는 ASN과 주어진 IP 블록을 가지고있는 다른 컬렉션을 가지고있다. 다음은 주어진 ASN에 대한 쿼리 필터링을 만들 수있는 간단한 방법이 지금

{ 
    "_id" : ObjectId("572ba2611c8e25e0a9c44f64"), 
    "ASN" : "6429", 
    "ip_block" : "200.14.215.0/24" 
}{ 
    "_id" : ObjectId("572ba2611c8e25e0a9c44f65"), 
    "ASN" : "6429", 
    "ip_block" : "200.27.0.0/16" 
} 

ASN 6429에 대한 예입니다?

구체적으로, 주어진 ASN과 일치하는 모든 IP에 대해 IP가 해당 ASN의 IP 블록 내에서 일치하는지 묻는 질문을하고 싶습니다.

내가 할 수있는 또 다른 일은 단지 데이터를 요청하고 ASN 당 필터링하지 않는 것입니다. 그런 다음 파이썬에서 일들을 필터링 할 수 있지만 DBMS에서 이러한 쿼리를 수행해야합니다.

힌트를 주시면 감사하겠습니다.

답변

1

IP 조회를위한 효율적인 쿼리 매개 변수를 갖기 위해 IP 저장 방법을 확장 할 것입니다.

{ 
    "ip" : "200.6.116.75", 
    ipaddress:{a:200, b:6, c:116, d:75} 
} 

이유 :

정상 표기 당으로서 우리는 당신이 그런 형태로 주소를 저장하는 데 어떻게 생각하십니까 쉽게 몽고 4 개 정수의 설정을 추출 할 수 없습니다 단지 문자열을 가지고?

넷 마스크를 사용하기 때문에 최대 및 최소 주소를 계산할 수 있습니다.

Address: 200.4.0.0    11001000.000001 10.01110001.00000000 
Netmask: 255.252.0.0 = 14  11111111.111111 00.00000000.00000000 
Wildcard: 0.3.255.255   00000000.000000 11.11111111.11111111 
=> 
Network: 200.4.0.0/14   11001000.000001 00.00000000.00000000 (Class C) 
Broadcast: 200.7.255.255   11001000.000001 11.11111111.11111111 
HostMin: 200.4.0.1    11001000.000001 00.00000000.00000001 
HostMax: 200.7.255.254   11001000.000001 11.11111111.11111110 
Hosts/Net: 262142  

다음 우리 쿼리가 보일 것 - 그것은 완전히 돌아갑니다

db.col.find({"ipaddress.a":200, 
      $and:{[ {"ipaddress.b": {$gte:3}},{"ipaddress.b": {$lte:7} }}}) 

을이 응용 프로그램 측의 오버 헤드가 추가로 :

의 우리가 '200.4.0.0/14 APN'있다고 가정 해 봅시다 일치하는 결과 쿼리. >=<= 사업자 비트 마스크 크기가 문제를 해결하는 영리한 방법을의

1-8 group a 
9-16 group b 
17-23 group c 
24-32 group b 
+0

에 따라 그룹에 영향을해야합니다 -

쿼리 생성이 까다로운 일이 될 수있다. 감사! –