我目前正在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中不可用。
答案 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);