Есть у меня скрипт, который опрашивает свитчи на предмет мак-адресов и выплевывает текстовик такого содержания:
10.124.125.34 d4ca6d446af8 1 50
10.124.125.34 d4ca6d777b75 1 50
10.124.125.34 00179a0268d7 2 44
10.124.125.34 001f29ead868 2 50
10.124.125.34 0022640720e4 2 50
10.124.125.34 1cbdb98ed8d1 2 50
10.124.125.34 404a0377d3ac 2 46
10.124.125.34 5067f0179dbf 2 46
10.124.125.34 d4ca6d3315da 2 50
10.124.125.34 d4ca6d331601 2 50
10.124.125.34 d4ca6d33160e 2 50
10.124.125.34 00030d915586 100 50
10.124.125.34 000d8758e0ab 100 50
т.е. если разделить строку пробелами - то параметры будут такими: 1 - ip-адрес свитча; 2 - мак-адрес на порту; 3 - vlan; 4 - порт
Посчитал, что если хранить это дело в монго - то лучше будет хранить следующим образом:
{
ip: 'ip',
ports:[
{
name: 'portname',
macvlan:[
{
mac: 'mac',
vlan: 'vlan'
}
]
}
]
}
Закинул весь текстовый документ в бд по такому принципу и тут же напоролся на подводные камни.
Т.е. если я хочу узнать на каких свитчах был нужный мне мак - то это решается легко и просто таким запросом:
.find({'ports.macvlan.mac'}, {ip:1})
Но как в таком случае мне найти на каком именно порту сидит мак? Ведь запрос без «проекции» выдаст весь документ целиком, а как бы выглядел нужный мне запрос я найти пока не могу не могу (роюсь сейчас в документации)
Т.е. Нужно разбивать по разным коллекциям свитчи и порты и в коллекциях портов хранить id-шники свитчей?
Или не париться и хранить в денормализованном виде каждую строку текстовика таким образом:
{
ip:'',
mac:'',
vlan: '',
port: ''
}
Вобщем-то тоже работает шустро, учитывая, что затея не запланирована на особое количество данных и их долгое хранение.