使用minimongo从多个mongo集合中获取数据的更好方法

时间:2017-04-13 20:01:50

标签: mongodb meteor minimongo

我目前正在Meteor中创建一个Web应用程序。这个应用程序使用MongoDb,当从客户端进行查询时,它使用minimongo与底层的mongoDb进行交互。

我在下面定义了2个集合

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

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

基本上,聊天集合包含聊天中所有用户的唯一用户ID,而用户集合包含系统中的所有用户。我试图在单个聊天文档中查询用户的所有用户名。

目前我通过首先在单个聊天中查询所有用户ID来实现此目的,然后使用javascript迭代这些用户ID以查找相应的用户名,如下所示:

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

这个方法非常难看,所以我想知道是否有更简洁的方法来使用minimongo(某种类型的连接等效?)。我查看了其他使用过populate或aggregate的帖子,但这些帖子在minimongo中不可用。

2 个答案:

答案 0 :(得分:1)

以下是我在服务器级别使用serverTransform package执行此操作的方法。

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;
                }
              }
            });
        });

现在你可以从对象本身获取它。

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

另一个受欢迎的软件包是publish-composite

答案 1 :(得分:0)

如果您有客户和客户聊天,那么您可以在查找中使用$in:运算符,然后使用.map()来避免所有循环和推送。

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