Условная ссылка MongoDB (или Morphia)

У меня есть коллекция C MongoDB, схема которой содержит ручную ссылку на другую коллекцию D, и я использую Morphia в Java для управления как C, так и D. D имеет логическое поле b в своей схеме, и я хотел бы проверить свою ссылку против b (т.е. когда новый документ c записывается в коллекцию C, если его ссылка указывает на некоторый объект d в коллекции D, тогда, если логическое значение b для d ложно, тогда MongoDB должен выдать ошибку).

Чтобы описать более конкретно, скажем, у вас есть 2 стандартных POJO для представления схем коллекции MongoDB:

class C {
    @Id
    public String id;

    @Reference
    public D target; 
}

class D {
    @Id
    public String id;

    public boolean b;
}

На основе этой схемы пример операции вставки будет выглядеть следующим образом (JSON):

{
    "target" : { "id": "MY_FANCY_ID" }
    //There is a record with id = "MY_FANCY_ID" in collection D
}

При вставке нового C с ненулевым целевым объектом (D) я хотел бы проверить, является ли target.b ложным, и если это так, то вывести ошибку базы данных.

1) Есть ли способ сделать это изначально в MongoDB?
2) Если не 1), то есть ли способ справиться с этим в Morphia (без какого-то чрезвычайно тупого и многословного взлома)?

Спасибо!

Возможно, вам стоит просто добавить проверку в C.setTarget ()

Nic Cottrell 23.08.2018 10:38

Проблема в том, что я хочу, чтобы C был как можно больше POJO, я не хочу внедрять хранилище данных в свой POJO.

Ertai87 23.08.2018 15:54
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
2
107
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Изначально для MongoDB вам не повезло. С Morphia вы можете использовать что-то вроде @PerPersist для выполнения дополнительного запроса, чтобы проверить это логическое значение. Это будет означать дополнительный запрос каждый раз, когда вы сохраняете C, если вы не создадите какой-либо ярлык, чтобы выполнять запрос только при начальной вставке. Здесь может помочь проверка, является ли идентификатор нулевым.

Спасибо, Эван! Приятно слышать от ведущего разработчика самого Морфии :) К сожалению, проверки, является ли идентификатор нулевым, здесь недостаточно; В этом случае значение null на самом деле является допустимым D (ссылка допускает значение NULL). Но хорошо знать, что мне не хватало простого обходного пути.

Ertai87 23.08.2018 15:37

Кроме того, если вы не возражаете, я был бы признателен, если бы вы могли взглянуть на этот другой вопрос, который не решался около недели: stackoverflow.com/questions/51884690/…

Ertai87 23.08.2018 15:56

Другие вопросы по теме