Vejo várias soluções para o seu problema:
Poucas atualizações
Para evitar junções, que precisam ser feitas do lado do cliente em bancos de dados NoSQL, coloque tudo em uma coleção. Se você não atualizar com muita frequência, você pode fazer
{
_id,
LastAccessDate,
HasException,
Account : {
AccountID,
UserName,
Email },
Device : {
DeviceID,
DeviceCode }
}
Isso resulta em dados duplicados, mas se o desempenho (sem junções) vem antes da eficiência da memória, provavelmente é uma solução adequada para você. Como os dados são armazenados várias vezes, as atualizações são mais exigentes para o servidor. Ou seja atualizar o endereço de e-mail seria
db.myColl.update({"Account.UserName" : "User ToUpdate"}, {"$set" : {"Account.Email" : "[email protected]"} });
Como você não precisa mais do AccountID e do DeviceID para ingressar, você também pode descartar esses dois campos.
Atualizações frequentes
Quando você tem atualizações frequentes, em vez de incorporar, você pode usar Referências. Eu acho que você tem que resolvê-los do lado do cliente. Você então tem três coleções:
Conta:
{
_id,
UserName,
Email
}
Dispositivo:
{
_id,
DeviceCode
}
Associação:
{
_id,
account : {
"$ref" : "Account",
"$id" : ... }
device : {
"$ref" : "Device",
"$id" : ... }
}
Você não tem nenhuma duplicação desta forma, mas você tem que lidar com referências.