Você pode evitar o
N+1
-problema de centenas de solicitações usando $in
-consultas. Considere isto:Post {
PosterId: ObjectId
Text: string
Comments: [ObjectId, ObjectId, ...] // option 1
}
Comment {
PostId: ObjectId // option 2 (better)
Created: dateTime,
AuthorName: string,
AuthorId: ObjectId,
Text: string
}
Agora você pode encontrar os comentários das postagens com um
$in
consulta, e você também pode encontrar facilmente todos os comentários feitos por um autor específico. Claro, você também pode armazenar os comentários como uma matriz incorporada na postagem e executar um
$in
consultar as informações do usuário ao buscar os comentários. Dessa forma, você não precisa desnormalizar os nomes de usuário e ainda não precisa de centenas de consultas. Se você optar por desnormalizar os nomes de usuário, terá que atualizar todos os comentários já feitos por esse usuário quando um usuário for alterado, por exemplo, o nome dele. Por outro lado, se tais operações não ocorrem com muita frequência, não deve ser um grande problema. Ou talvez seja ainda melhor armazenar o nome que o usuário tinha quando fez o comentário, dependendo de suas necessidades.
Um problema geral com a incorporação é que diferentes escritores escreverão no mesmo objeto , então você terá que usar os modificadores atômicos (como
$push
). Isso às vezes é mais difícil de usar com mapeadores (embora eu não conheça a mongoalquimia) e geralmente menos flexível.