MongoDB - Запрос по поддереву - PullRequest
2 голосов
/ 26 октября 2011

У меня есть структура документа, аналогичная упрощенной версии, показанной ниже:

{
  some_other_props: { ... },
  systems: {
    sys1: {
      score: 24,
      metric: 52
    },
    another_sys: {
      score: 9,
      metric: 77
    },
    some_other_sys: {
      score: 12,
      metric: 5
    }
  }
}

Я хотел бы вернуть все документы, где score : { "$gte" : 15 } верно для любого из вложенных документов.

Единственный способ, которым я мог придумать, - это получить список ключей в system и преобразовать его в какой-то беспорядок операторов или операторов.Но похоже, что я делаю что-то не так.

Я мог бы переформатировать структуру документа так, чтобы каждая система была в своем собственном документе ... но в some_other_props есть много другой информации, и теперь переформатирование будетбыть болью.

По правде говоря, я пытаюсь сделать что-то более сложное.Верните все документы, в которых разница между score и metric одной и той же системы сильно различается.Но прежде чем я смог это сделать, я хотел убедиться, что могу просто выполнять простые запросы к поддеревьям, как я показал выше.

Может кто-нибудь подсказать, как запрашивать поддеревья в MongoDB?

Ответы [ 2 ]

3 голосов
/ 26 октября 2011

Вам следует рассмотреть возможность хранения вложенных документов в виде массива:

{
  some_other_props: { ... },
  systems: 
    [ {id: 'sys1',
      score: 24,
      metric: 52
    },
    { id: 'another_sys',
      score: 9,
      metric: 77
    }]

}

Тогда вы можете просто запросить find 'systems.score' : { '$gte' : 15 }, и вы также можете создать индекс для 'systems.score', если вы чувствуете, чтотебе это нужно.

0 голосов
/ 26 октября 2011

Если вы теперь точно, что забиваете, вы можете сделать толстый "или" запрос:

$or : [{ systems.sys1.score : { "$gte" : 15 } }, {systems.another_sys.score : { "$gte" : 15 }}]

но это похоже на неудачный способ решения проблемы. поэтому я предлагаю создать другой каталог для system_scores, в котором есть многозначная ссылка на коллекцию system_props. Это упростит запрос.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...