Обновление и поиск встроенной структуры Mongodb?

59
7

Играя с MongoDB для хранения результатов сканирования сети nmap и пытаясь найти лучший способ структурирования данных.

На данный момент у меня есть следующее:

{
"_id" : ObjectId("525f94097025166583e18eba"),
"ip" : "127.0.0.1",
"services" : [
{
"port" : "22",
"port_info" : [
{
"product" : "ssh",
"version" : "1.0"
}
]
},
{
"port" : "80",
"port_info" : [
{
"product" : "apache",
"version" : "2.0"
}
]
}
]
}

Я могу найти, например, хосты с открытым портом 22, пример против 127.0.0.1 с этим

db.hosts.find({ ip : "127.0.0.1"}, {"services" : { $elemMatch : { port : "22" }}})

Но я не уверен, как найти, например, все хосты, у которых есть "продукт": "ssh" пытается, но я получаю синтаксическую ошибку

db.hosts.find({ ip : "127.0.0.1"}, { services.port_info : { $elemMatch : { product : "ssh"    }}})

Тогда позвольте сказать, что я хочу добавить еще один элемент в "port_info", возможно, что-то вроде протокола: tcp

как бы я сделал обновление, где я говорю что-то вроде обновления, где ip: 127.0.0.1 и продукт ssh?

спросил(а) 2013-10-17T20:01:00+04:00 7 лет, 1 месяц назад
1
Решение
71

Синтаксическая ошибка заключается в том, что вы должны использовать кавычки вокруг services.port_info Тем не менее, $elemMatch во вложенных полях в настоящее время не поддерживается в любом случае К счастью, вам не нужен $elemMatch для такого рода запросов

Это должно сделать:

db.hosts.find({ ip : "127.0.0.1"}, { "services.port_info.product" : "ssh" });

$elemMatch требуется, если вы хотите $elemMatch несколько критериев внутри объекта массива, например "найти все, где порт 9000, а протокол - UDP". Это не будет поддерживать вашу структуру данных. Я не уверен, почему port_info - это массив объектов (возможно, для неопределенных ситуаций, когда порт может принадлежать двум различным службам?) - если бы это был единственный объект, то даже поддержка $elemMatch была бы поддержана.

Кроме того, имейте в виду, что такой запрос всегда возвращает весь объект.

ответил(а) 2013-10-18T00:26:00+04:00 7 лет, 1 месяц назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема