Hay gente en una ciudad. Una ciudad está representada por una colección mongodb llamada "ciudades". Las personas en la ciudad están solas o caminando juntas con otra persona en la misma ciudad.
El esquema es:
{ name: String, people: [ { name: String, status?: String, walkingWith?: String } ] }Los campos "status" y "walkingWith" son los que me gustaría usar, si mi estrategia es correcta.
Aquí hay algunas entradas:
var newyorkPeople = []; newyorkPeople[0] = {"name": "Jack", "status": "alone", "walkingWith": "none"}; newyorkPeople[1] = {"name": "James", "status": "meeting", "walkingWith": "Maria"}; newyorkPeople[2] = {"name": "Robert", "status": "meeting", "walkingWith": "Nina"}; newyorkPeople[3] = {"name": "Steven", "status": "alone", "walkingWith": "none"}; newyorkPeople[4] = {"name": "Maria", "status": "meeting", "walkingWith": "James"}; newyorkPeople[5] = {"name": "Nina", "status": "meeting", "walkingWith": "Robert"};Luego entro en una nueva ciudad con gente en ella:
db.cities.insert({"name": "New York", "people": newyorkPeople});Ahora, el objetivo es facilitar que un cliente (interfaz) describa qué personas hay en esta ciudad. Y agruparlos. Primero muestra a todas las personas solitarias. Y luego las "parejas" que caminan juntas.
No estoy seguro de si es mejor hacer la agrupación en el backend o en el frontend (angular).
En backend (api) estoy usando express.js. La API podría simplemente devolver todo el documento de la ciudad a la interfaz. Y luego la interfaz sería responsable de clasificar/agrupar a las personas.
En ese caso, la estrategia en la que estoy pensando sería:
Recorra a las personas y solo imprima las personas solitarias. Los que están caminando con alguien, deben ir en otro arreglo. Así que el primer paso, mostrar a todas las personas solitarias, está cumplido.
Ahora, todavía necesito mostrar parejas. Primero necesito mostrar la pareja "James y Maria" y luego la pareja "Robert y Nina". ¿Debo crear una matriz para cada pareja? En el ejemplo anterior, debería crear 2 matrices.
Sin embargo, no estoy seguro de que esta sea la mejor estrategia. Estoy bien para modificar el esquema de base de datos o incluso dejar que el backend entregue a las personas agrupadas si alguien pudiera dar alguna buena sugerencia.
Puede utilizar el siguiente esquema (simplificado de los suyos)
{ name:Stirng, //name of the person city:String, //name of the city status:String, //status walkingWith:String //name of the person walking with }El beneficio de usar este esquema es que puede facilitar sus consultas. Vamos a consultar su necesidad.
1- todas las personas en una ciudad
db.city.aggregate([ {$group:{_id:"$city", people:{$push:"$name"}}} ])2- todas las personas en una ciudad sola
db.city.aggregate([ {$match:{status:"alone"}}, {$group:{_id:"$city", people:{$push:"$name"}}} ])3- todas las personas en una ciudad reuniéndose con alguien
db.getCollection('demos').aggregate([ {$match:{status:"meeting"}}, {$group:{_id:"$city", people:{$push:{name:"$name", walkingWith:"$walkingWith"}}}} ])