2017-04-13 5 views
0

Ich erstelle derzeit eine Web-App in Meteor. Diese App verwendet MongoDb und wenn sie Anfragen vom Client macht, verwendet sie Minimongo, um mit dem zugrunde liegenden MongoDb zu interagieren.Bessere Möglichkeit, Daten aus mehreren Mongo-Sammlungen mit minimongo zu bekommen

Ich habe 2 Sammlungen definiert unter

const chats = { 
     userIds: [], 
     //other data irrelevant to question 
    }; 

const users = { 
      userId: string, 
      username: string 
      //other data irrelevant to question 
     }; 

Also im Grunde, die Chat-Sammlung des eindeutigen Benutzer-IDs für alle Nutzer im Chat enthält und die Benutzer-Sammlung enthält alle Benutzer im System. Ich versuche, alle Benutzernamen der Benutzer in einem einzelnen Chat-Dokument abzufragen.

Derzeit bin zu erreichen ich dies durch erste Abfrage für alle Benutzer-IDs in einem Chat, dann mit Hilfe von Javascript über diese Benutzer-IDs wiederholen ihre entsprechenden Benutzernamen wie so zu finden:

var thisChat = Chats.findOne(this.chatId); //get current chat document 
      var userList = thisChat.userIds; //get list of user id's from this chat  

      this.newUserList = []; 
      for(var i = 0; i < userList.length; i++) { //iterate over user id's 
       var tempUser = Meteor.users.find({_id: userList[i]}).fetch(); //find username for this userId 
       this.newUserList.push(tempUser[0]); //add this username to an array 
      } 
      }); 
     }); 

    return this.newUserList; //return list of usernames 

Diese Methode ist ziemlich hässlich, also frage ich mich, ob es einen saubereren Weg gibt, dies mit minimongo zu tun (eine Art Join-Äquivalent?). Ich habe mir andere Beiträge angeschaut, die Population oder Aggregation verwendet haben, aber diese sind nicht in Minimongo verfügbar.

Antwort

1

So würde ich dies auf Serverebene mit der serverTransform package tun.

Meteor.publishTransformed('currentChat', function() { 
     return Chats.find() 
     .serverTransform({ 
      'usernames': function(chat) { 
       return Meteor.users.find({ 
       _id: { 
        $in: chat.userIds 
       } 
       }).map(function(user) { 
        return user.username; 
       } 
       } 
      }); 
     }); 

Jetzt können Sie es sich von dem Objekt nur bekommen.

var thisChat = Chats.findOne(this.chatId); 
var usernames = thisChat.usernames; 

Ein weiteres beliebtes Paket ist publish-composite

0

Wenn Sie die Benutzer und die Chats auf den Kunden haben, dann können Sie den $in: Operator in Ihrer Entdeckung durch einen .map() gefolgt verwenden alle Looping zu vermeiden und schieben.

const usernames = Meteor.users.find(
    { _id: { $in: Chats.findOne(this.chatId).userIds }} 
).map(doc => doc.username); 
Verwandte Themen