Debes tener en siempre en cuenta que chat NO es igual a chat.
Te hablo de experiencia, soy desarrollador de una página de contactos e hicimos que la forma de contactar a la otra persona fuera mediante un chat...Si la otra persona no se encuentra pues cuando se conectaba lo recibia, así nos evitamos crear un módulo de mensajes privados.
Quieres tanto un chat todos con todos, como un chat 1 con 1. Mi consejo es que los trates como 2 cosas diferentes, además complica muchísimo las cosas.
El tema es como plantearselo, una vez que tienes un plan con pautas programarlo es facil.
Usemos un sistema por transmisiones.
0 es a todos
>0 es a refiriendose a la id del usuario conectado al chat
En la base de datos mongo, cuando guardas los mensajes del chat, debes indicar a que canal estaba destinado el mensaje.
En php creas estas funciones (me imagino que el login y eso no necesito explicarlo)
-Solicitar todos los mensajes nuevos (de sala 0 y donde sala == id del usaurio), esta funcion tiene que devolver un array en formato json con el mensaje en si, y la sala a la que estaba destinado...Así en el cliente web podemos separarlo entre: mensaje global y mensaje privado)
-Enviar mensaje a sala, esta funcion la llama el cliente cuando efectivamente envia un mensaje, recibe el mensaje y la sala en la que se encuentra (lo averiguamos mediante el dom del html), devuelve true o false
Ambas funciones recibirán una ruta directa..O sea si pones en el navegador /chatmensaje debe ejecutar directamente esa función..Te dejó la teoria solo ya que no sé como es la base php que elegistes, pero no le veo un gran problema.
En todoas las funciones tienes que comprobar:
-Si el usuario que accede a la función se encuentra
-Que se ha accedido a la ruta mediante AJAX...Si alguien pone manualmente el enlace en el navegador está intentando vulenerar el sistema, no podemos tolerarlo
Hay una funcion genial en php para comprobar si la petición fue recibida mediante ajax o no, te dejo un trozo de mi código
Código PHP:
//Ser ajax
if(isset($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest')
$this->is_ajax = TRUE;
else
$this->is_ajax = FALSE;
No sé si me he enrollado demasiado, o me falto por explicar algo, avisame si necesitas mas informacion.
Con estas funciones, el cliente deberia saber siempre cuando un mensaje que recibe es de global y cuando es de otro usuario.
EDIT: se me olvidó que no solo se usa para la web sino que tambien para android, etc..Olvida lo de AJAX.