У меня есть коллекция 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 был как можно больше POJO, я не хочу внедрять хранилище данных в свой POJO.




Изначально для MongoDB вам не повезло. С Morphia вы можете использовать что-то вроде @PerPersist для выполнения дополнительного запроса, чтобы проверить это логическое значение. Это будет означать дополнительный запрос каждый раз, когда вы сохраняете C, если вы не создадите какой-либо ярлык, чтобы выполнять запрос только при начальной вставке. Здесь может помочь проверка, является ли идентификатор нулевым.
Спасибо, Эван! Приятно слышать от ведущего разработчика самого Морфии :) К сожалению, проверки, является ли идентификатор нулевым, здесь недостаточно; В этом случае значение null на самом деле является допустимым D (ссылка допускает значение NULL). Но хорошо знать, что мне не хватало простого обходного пути.
Кроме того, если вы не возражаете, я был бы признателен, если бы вы могли взглянуть на этот другой вопрос, который не решался около недели: stackoverflow.com/questions/51884690/…
Возможно, вам стоит просто добавить проверку в C.setTarget ()