Запрос Mongo для значения в объекте с любым ключом

Предположим, у нас есть документы в коллекции Mongo следующего формата:

{
    "_id" : "5fb3c5ce9997c61e15a9108c",
    "stages" : {
          "stage1" : {
              "type" : "RandomType"
          },
          "stage2" : {
              "type" : "RandomType2"
          },
          "arbitaryStage" : {
              "type" : "RandomType3"
          },
          // Possibly many other stages
    },
    // Fields omitted
}

Как я могу запросить набор таких документов, где любое stages.X.type равно предопределенному значению? Мое приложение не знает, что такое X и не заботится об этом, оно должно знать только, что тип хотя бы одного из этапов равен заданному значению. Я пытаюсь сделать это в Morphia, однако простой JS поможет мне, если это возможно сделать с данным форматом данных.

Для справки, класс, из которого произошел этот объект, следующий:

@Entity(value = "stages_collection", noClassnameStored = true)
public class StackOverflowQ {
    @Id
    private ObjectId id;
    @Embedded
    private Map<String, Stage> stages;
    // Rest of fields/setters/getters omitted
}

public class Stage {
    private String type;
    // Rest of fields/setters/getters omitted
}

person Haris    schedule 15.02.2021    source источник
comment
Использование оболочки mongo: вы можете попробовать использовать запрос агрегации с оператором $objectToArray, примененным к встроенному документу stages. Затем следуйте за ним со стадией $match, чтобы соответствовать stages.v.type.   -  person prasad_    schedule 15.02.2021


Ответы (1)


Даже если вы используете полную проверку, если система не может выбрать правильное поле, то в основном лучшее, что мы можем сделать, это выполнить поиск по всей коллекции, даже если вы найдете способ сделать это, это будет не очень эффективно.

Простое изменение схемы было бы лучше, если вы ожидаете случайных полей в данных. В твоем случае.

{
 stageName : "Stage 1",
 type : "RandomType" 
}

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

person Gandalf the White    schedule 15.02.2021
comment
К сожалению, в данном случае у меня нет такого варианта, хотя он идеален. - person Haris; 16.02.2021