Seu desafio vem do fato de que
Prop_Info
deve ser recuperado por ambas as consultas. Isso torna difícil descobrir em qual coleção Mongo ele deve viver. No MongoDB, você cria seu esquema de documento com o objetivo ideal de que um único documento tenha todas as informações necessárias de acordo com seus padrões de consulta. No caso de você precisar ter os mesmos dados
D
(como Prop_Info
no seu caso) retornado por duas consultas separadas em duas coleções separadas A
e B
, você deve escolher entre as três estratégias a seguir:-
DuplicarD
nos documentos de ambosA
eB
e imponha consistência com seu código. Normalmente, essa é a escolha de design de sistemas de alto desempenho que desejam eliminar a necessidade de uma segunda consulta, mesmo que isso tenha o custo de complexidade de código adicional no lado da inserção/atualização e com alguns possíveis problemas de consistência, pois o Mongo não é ACID.
-
ColoqueD
emA
e armazene uma referência (DBRef ou alguma outra combinação de campos de identificação) emB
para que você possa acessá-lo com uma segunda consulta. Esta é normalmente a escolha de design quando o número de consultas paraA
excede o número de consultas paraB
. Ele mantémD
local para a coleção consultada com mais frequência. Neste padrão de design de esquema, você só precisa fazer uma segunda consulta ao consultarB
.
-
ColoqueD
em uma nova coleçãoC
e faça uma segunda consulta a ele deA
eB
. Normalmente, essa é a escolha de design diante de requisitos futuros muito incertos, nos quais não está claro quais seriam as compensações se você optar por (1) ou (2) acima. É o esquema mais "relacional" e aquele que o forçará a fazer uma segunda consulta quando você consultar tantoA
eB
.
A estratégia escolhida depende do seu domínio, dos padrões de consulta, do suporte que você obtém de sua estrutura de mapeamento relacional de objeto (ORM) (se você usar uma) e, por último, mas não menos importante, de sua preferência.
Nas situações que encontrei, nunca escolhi (3). Eu usei (1) em situações de alto desempenho (sistemas analíticos). Eu usei (2) em todos os outros lugares desde que os padrões de acesso de consulta tornaram óbvio onde os dados "compartilhados" deveriam residir.
Depois de escolher sua estratégia, se você ainda precisar de ajuda, poste outra pergunta SO que se concentre especificamente no problema de design do esquema de acordo com a estratégia escolhida.
Três dicas finais:
-
Se os dados compartilhadosD
tem uma multiplicidade de relacionamento maior que 1 use um array. Você pode indexar arrays inteiros e consultar precisamente dentro de arrays usando$elemMatch
.
-
Para atualizarD
na estratégia (1) ou (2) use o modificador atômico do MongoDB operações , muitos dos quais são projetados para operar em matrizes.
-
Esta pergunta SO cobre o padrão de duas consultas DBRef na resposta de @Stennie. (@Stennie funciona para 10gen, os marcadores do MongoDB.)
Boa sorte!