Using Meteor:
我在messages中有一个存储userId的消息列表。
Messages = new Mongo.Collection('messages');
// example of message data:
{
authorId: 'XFdsafddfs1sfd', // corresponding to a Meteor.userId
content: 'some Message'
}
我正在发布消息和现有用户。
Meteor.publish('messages', function () {
return Messages.find({});
});
Meteor.publish('users', function () {
return Meteor.users.find({});
});
目前我可以抓取消息列表并根据userid添加用户名。因为用户可以更改他们的用户名&配置文件信息,将用户数据添加到集合中是没有意义的,只添加userid。
var messages = Messages.find({}).fetch();
var messages.forEach(function(message) {
message.username = Meteor.users.find(message.authorId).fetch() [0].username; // ugly
});
这段代码可以工作,但是涉及很多浪费的调用。我想知道如何更好地完成这件事。
在Meteor中,什么是最高效的&最干净的方式配对用户数据与包含userid的集合?
这是一个常见的用例:在数据库中存储其他集合的id,并在UI上使用人类可读的参数。
在Meteor中,collection.find()函数为这个用例提供了传递转换回调的功能。
var cursor = messages.find(
{},
{
transform: transformMessage
}
);
transform函数现在可以直接修改你的对象,添加/修改/删除你获取的对象的属性(注意:出于安全原因不要在客户端修改/删除:而是在服务器端使用过滤器和允许/拒绝)
function transformMessage(message) {
var user = Meteor.users.findOne(message.authorId);
if (user) {
var username = user.username;
message.username = username;
}
return message;
};
这样做的最大好处是:您仍然在处理游标,并防止fetch()。当然,还有更简洁的代码。