在Meteor出版物中有条件限制Mongodb字段

时间:2015-08-08 15:29:20

标签: mongodb meteor

我有这个Meteor发布的数据库中的所有帖子。 我想仅在帖子的owner字段为真时返回帖子的isAnonymous字段(即如果帖子是匿名的,不发布所有者?

如何在Meteor / Mongodb中制作此条件?我在这里的脚本永远不会归还所有者。

Meteor.publish('posts', function(id) {
    var posts = Posts.find({},{fields: {owner: 0}},{sort: {created_at: -1}});
    return posts;
});

我试过这样的东西,但它不起作用

Meteor.publish('posts', function(id) {
        var posts = Posts.find({},{fields: {owner: { $cond: [ { $eq: [ "isAnonymous", 1 ] }, 0, 1 ] }}},{sort: {created_at: -1}});
        return posts;
    });

2 个答案:

答案 0 :(得分:2)

你似乎想要的是这样的:

Meteor.publish('posts',function(args) {
    var self = this;

    Posts.find().fetch().forEach(function(post) {
        if ( post.hasOwnProperty("isAnonymous") ) {
            if ( post.isAnonymous ) {
                delete post.owner;
                delete post.isAnonymous;
            }
        }
        self.added("postsFiltered",post._id,post);
    });
    self.ready();
});

然后基本上在客户端中定义您的集合至少:

Posts = new Meteor.Collection("postsFiltered");

然后在您订阅后,客户端将只看到没有"隐私"信息,因为它总是以这种方式发布。

答案 1 :(得分:1)

如果您不想仅在某些情况下返回字段,则可以为集合定义转换函数。像这样:

Posts = new Mongo.Collection('posts', {
    transform: function(doc) {
        if (-- condition for not returning owner is true --) {
            delete doc.owner;
        }
    }
});

如果您可以返回它,但在某些情况下不想显示它,您可以在模板中执行此操作:

{{#each posts }}
    ...
    {{#if isOwnerKnown owner }}  
        {{ owner }}
    {{/if }}
    ...
{{/foreach}}

Template.people.helpers({

    isOwnerKnown: function(owner){
        return owner != 'Anonymous';
    }
    ...
});