2014-02-04 4 views
1

Я пытаюсь получить данные из одного или нескольких поддокументов, но я не знаю названия поля, которое будет содержать поддокумент. Вот несколько примеров того, как выглядят документы.MongoDB Как получить значение из поддокумента, когда имя поля неизвестно

  1. https://github.com/vz-risk/VCDB/blob/master/data/json/0C5DE044-B9B4-408D-9E65-D367EED12AB2.json
  2. https://github.com/vz-risk/VCDB/blob/master/data/json/064F5887-C2DA-4139-B3AA-D55906F8C30A.json

Я хотел бы получить варианты действий для этих случаев, так и в случае первого, я хотел бы получить action.malware.variety и действие. social.variety. Во втором примере это будет action.hacking.variety и action.malware.variety. Поэтому проблема заключается в том, что я не знаю, какое поле будет содержать поддокумент. Это может быть один из хакеров, вредоносных программ, социальных, ошибок, злоупотреблений, физических и экологических.

Так что я хотел бы, чтобы $ развернуть это поле и сделать что-то с ключевым именем. Это что-то, что можно сделать с помощью агрегации или мне нужно переключиться на mapReduce?

+0

Трудно сделать, используя структуру агрегации, поскольку вы можете только развернуть массивы объектов. В примере json атрибут action - это всего лишь объект, но не массив объектов. Так что расслабиться здесь нельзя. Будет ли нормально, если схема будет реструктурирована? Также скажите мне, как бы вы действительно хотели, чтобы результат отображался. –

+0

Это был справедливый вопрос, так как не все знают о потребностях в $ ifNull и $ cond в прогнозе агрегации –

+0

@ cj0809, возможно, вам стоит взглянуть на принятый ответ, демонстрирующий работу с обнаруженной вами проблемой. –

ответ

3

Вы, кажется, говорите о случае, когда вы не уверены, что все хакерские, социальные или малаварные части есть. Я думаю, что вы хотите $project первое использование оператора $ifNull как в:

db.stuff.aggregate([ 
    {$project: 
     { 
      hacking: {$ifNull: ["$action.hacking.variety",[null]]}, 
      social: {$ifNull: ["$action.social.variety",[null]]}, 
      malware: {$ifNull: ["$action.malware.variety",[null]]} 
     } 
    }, 
    {$unwind: "$hacking"}, 
    {$unwind: "$social"}, 
    {$unwind: "$malware"} 
]) 

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

Смежные вопросы