我正在编写通知系统(如facebook通知)。所以我有一个通知集合,每个文档都有一个' actorId'存储调用该通知的用户的_id的字段。我想发布最新的通知和演员'单个出版物中的那些通知的信息。所以这是我的发布功能:
Meteor.publish("myNotifications", function () {
let notificationCursor = Notifications.find({receiver: this.userId});
// get an array of actorIds, so we can fetch users' info in a single query
let actorIds = [];
notificationCursor.forEach(function(notification) {
actorIds.push(notification.actor);
});
return [
notificationCursor,
Meteor.users.find({_id: { $in: actorIds }})
];
});
我使用React。这是我的组成部分:
NotificationBlock = React.createClass({
mixins: [ReactMeteorData],
getMeteorData() {
let data = {
notifications: []
};
let handle = Meteor.subscribe('myNotifications');
if (handle.ready()) {
data.notifications = Notifications.find({}).fetch();
}
return data;
},
renderNotifications() {
let list = [];
_.each(this.data.notifications, notification => {
let actor = Meteor.users.findOne(notification.actorId);
list.push(
<li key={notification._id}>
{actor.profile.name} did something...
</li>
);
});
return list;
},
render() {
return (
<ul>
{this.renderNotifications()}
</ul>
);
}
});
问题是,当有新通知时,似乎只有通知才会通过“我的通知”发布。出版物。新通知的演员信息无法通过。所以客户端控制台显示错误,说“演员&#39;在反应组件的这一行是未定义的:
{actor.profile.name} did something...
但是,如果我刷新浏览器,新通知会正确显示(带有演员的信息),而控制台完全没有任何错误!
我的猜测是,在单个出版物中发布多个游标时,只有那些已经添加&#39;,&#39;更改&#39;&#39;删除&#39;事件更新了,对吗?这就是为什么&#34; Meteor.users.find({_ id:{$ in:actorIds}})&#34;不包括新的用户信息,尽管它的参数已被更改。
答案 0 :(得分:1)
此类集合加入问题的经典解决方案是使用reywood:publish-composite包。这样你的出版物就会变成:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/fragment2"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layout_behavior="@string/appbar_scrolling_view_behavior">
<android.support.v7.widget.RecyclerView
android:id="@+id/recycler_view_android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentStart="true"
app:layout_behavior="@string/appbar_scrolling_view_behavior" />
</RelativeLayout>
还请注意users集合返回的字段的限制。您真的不想为每个其他用户返回整个用户对象。