在流星中发布虚拟集合

时间:2015-12-03 21:27:35

标签: meteor nosql

我试图发布一个有两个不同名字的集合。 freeCourses包含没有paid_url字段的课程。 premiumCourses包含userCourses集合中存在的所有id。

userCourses集合: { user_id: "1", course_id: "1" }

Meteor.publish('freeCourses', function () {
            this.added('freeCourses', Courses.find({}, {fields: {'Seasons.Episodes.paid_url': 0}}));
            this.ready();
        });
        Meteor.publish('premiumCourses', function () {
            //userPremiumCourses is array of course_ids
            var userPremiumCourses = userCourses.find({'user_id': this.userId}, {fields: {course_id: 1, _id: 0}}).map(
                function (doc) {
                    return doc.course_id;
                }
            );
            this.added('premiumCourses', Courses.find({_id: {$in: userPremiumCourses}}));
            this.ready();
        });
if(Meteor.isClient){
Meteor.subscribe('freeCourses');
Meteor.subscribe('premiumCourses');
}

我希望将freeCourses和premiumCourses作为客户端上的两个不同的集合。

2 个答案:

答案 0 :(得分:1)

我以前从未见过这样做过但如果有可能我相信你需要定义两个引用相同底层mongo集合的集合:

freeCourses = new Mongo.collection('userCourses');
premiumCourses = new Mongo.collection('userCourses');

我刚刚测试过那个但是失败了。

一个集合可以有多个发布,每个发布都有自己的查询参数和字段,但看起来你想要更像SQL view 的东西。这在Meteor afaik中并不存在。

答案 1 :(得分:1)

所以我使用了publishVirtual函数。感谢@michel floyd

function publishVirtual(sub, name, cursor) {
  var observer = cursor.observeChanges({
    added  : function(id, fields) { sub.added(name, id, fields) },
    changed: function(id, fields) { sub.changed(name, id, fields) },
    removed: function(id)         { sub.remove(name, id) }
  })

  sub.onStop(function() {
    observer.stop() // important. Otherwise, it keeps running forever
  })
}

并将其添加到发布中:

Meteor.publish('freeCourses', function () {
    var cursor = Courses.find({}, {fields: {'Seasons.Episodes.paid_url': 0}});
    publishVirtual(this, 'freeCourses', cursor);
    this.ready();
});
Meteor.publish('premiumCourses', function () {
    //userPremiumCourses contains array of course_ids
    var userPremiumCourses = userCourses.find({'user_id': this.userId}, {fields: {course_id: 1, _id: 0}}).map(
        function (doc) {
            return doc.course_id;
        }
    );
    var cursor = Courses.find({_id: {$in: userPremiumCourses}});
    publishVirtual(this, 'premiumCourses', cursor);
    this.ready();
});

为订阅创建了两个客户端集合:

if (Meteor.isClient) {
    freeCourses = new Mongo.Collection("freeCourses");
    premiumCourses= new Mongo.Collection("premiumCourses");

    Meteor.subscribe('freeCourses');
    Meteor.subscribe('premiumCourses');
}