Мы можем объединить / объединить все данные внутри одной коллекции с простой функцией в нескольких строках с помощью клиентской консоли mongodb, и теперь мы сможем выполнить требуемый запрос. Ниже полный пример:
.- Авторы:
db.authors.insert([
{
_id: 'a1',
name: { first: 'orlando', last: 'becerra' },
age: 27
},
{
_id: 'a2',
name: { first: 'mayra', last: 'sanchez' },
age: 21
}
]);
.- Категории:
db.categories.insert([
{
_id: 'c1',
name: 'sci-fi'
},
{
_id: 'c2',
name: 'romance'
}
]);
.- Книги
db.books.insert([
{
_id: 'b1',
name: 'Groovy Book',
category: 'c1',
authors: ['a1']
},
{
_id: 'b2',
name: 'Java Book',
category: 'c2',
authors: ['a1','a2']
},
]);
.- Книжное кредитование
db.lendings.insert([
{
_id: 'l1',
book: 'b1',
date: new Date('01/01/11'),
lendingBy: 'jose'
},
{
_id: 'l2',
book: 'b1',
date: new Date('02/02/12'),
lendingBy: 'maria'
}
]);
.- Магия:
db.books.find().forEach(
function (newBook) {
newBook.category = db.categories.findOne( { "_id": newBook.category } );
newBook.lendings = db.lendings.find( { "book": newBook._id } ).toArray();
newBook.authors = db.authors.find( { "_id": { $in: newBook.authors } } ).toArray();
db.booksReloaded.insert(newBook);
}
);
.- Получить новые данные коллекции:
db.booksReloaded.find().pretty()
.- Ответ:)
{
"_id" : "b1",
"name" : "Groovy Book",
"category" : {
"_id" : "c1",
"name" : "sci-fi"
},
"authors" : [
{
"_id" : "a1",
"name" : {
"first" : "orlando",
"last" : "becerra"
},
"age" : 27
}
],
"lendings" : [
{
"_id" : "l1",
"book" : "b1",
"date" : ISODate("2011-01-01T00:00:00Z"),
"lendingBy" : "jose"
},
{
"_id" : "l2",
"book" : "b1",
"date" : ISODate("2012-02-02T00:00:00Z"),
"lendingBy" : "maria"
}
]
}
{
"_id" : "b2",
"name" : "Java Book",
"category" : {
"_id" : "c2",
"name" : "romance"
},
"authors" : [
{
"_id" : "a1",
"name" : {
"first" : "orlando",
"last" : "becerra"
},
"age" : 27
},
{
"_id" : "a2",
"name" : {
"first" : "mayra",
"last" : "sanchez"
},
"age" : 21
}
],
"lendings" : [ ]
}
Надеюсь, эти строки помогут вам.
Это нормально, что пользователь может содержать такие методы, как: CreateDocument (params), SendDocumentForApproval (docId), ApproveApprovalStepOfDocument (stepId)?
blockquote>В большинстве моделей доменов метод принадлежит к сущности, которая управляет государством, которое собирается измениться.
Document document = User.SendDocumentForApproval(command.DocId); _documentRepository.Update(document);
Тот факт, что ваш пример обновляет хранилище документов, является большим намеком на то, что это документ, который изменяется, и поэтому мы обычно ожидаем увидеть SendDocumentForApproval в качестве метода в документе.
document.SendDocumentForApproval(command.UserId) _documentRepository.Update(document);
(Да, код не читается как письменный или разговорный английский.)
Когда создает новый документ ... шаблоны создания странные. Уди Дахан предполагает, что в вашей доменной модели всегда должна быть какая-то сущность, отвечающая за создание других сущностей, но я не уверен, что с результатом на самом деле легче работать в долгосрочной перспективе. [ 1111]
Как мы можем смоделировать бизнес-процесс утверждения
blockquote>Общий ответ: бизнес-процессы - это протоколы , то есть обычно их можно смоделировать как Государственный аппарат. Вот то состояние, в котором мы сейчас находимся, вот какая-то новая информация из внешнего мира, вычисление последствий.
(Часто модель данных ) для процесса будет просто выглядеть как история событий; работа модели предметной области состоит в том, чтобы затем взять новую информацию и вычислить правильные события для хранить в истории. Вам не нужно делать это таким образом, но есть интересные возможности, когда вы можете).
Вы движетесь в правильном направлении, пользователь и документ являются совокупными, поскольку они созданы в отдельных транзакциях. Когда речь заходит о том, кто на кого ссылается, принцип масштабируемости IDDD гласит, что агрегаты должны ссылаться на агрегаты только через их идентификаторы.
Я думаю, что придерживаясь повсеместного языка, ваш код должен выглядеть примерно так
class User {
private UserId id;
private String name;
User(String name) {
this.id = new UserId();
this.name = name;
}
Document createDocument(String name) {
Document document = new Document(name);
document.createdBy(this);
return document;
}
Document approve(Document document) {
document.approved();
return document;
}
}
class Document {
private DocumentId id;
private String name;
private UserId userId;
private Boolean isApproved;
Document(String name) {
this.id = new DocumentId();
this.name = name;
}
void createdBy(UserId userId) {
this.userId = userId;
}
void approved() {
this.isApproved = true;
}
}
// User creation
User user = new User("Someone");
userRepository.save(user);
//Document creation
User user = userRepository.find(new UserId("some-id"))
Document document = user.createDocument("important-document")
documentRepository.save(document)
// Approval
User user = userRepository.find(new UserId("some-id"))
Document document = documentRepository.find(new DocumentId("some-id"))
document = user.approve(Document)
Я бы настоятельно рекомендовал прочитать серию статей о работе Вогона Вернона, состоящую из трех частей, , улучшенную агрегированную разработку 114]