【问题标题】:Transforming on excluded field in meteor Mongo Collection在流星 Mongo 集合中的排除字段上进行转换
【发布时间】:2015-02-07 22:57:21
【问题描述】:
Meteor.publish("thing", function(options) {

    return Collection.find({}, {fields: {anArray: 0}})
})

我排除了“anArray”,因为它包含不打算被每个用户看到的用户 ID。但是它可能包含登录用户本身,在这种情况下用户需要知道它。

Collection = new Mongo.Collection("thing", {
    transform: function(document) {

        _.each(document.anArray, function(item) {

            item = true
        })

        return document
    }
})

上面我尝试转换集合(简化),但是因为排除了“anArray”,所以根本没有定义“anArray”。

如何让用户知道他在“anArray”中而不影响“anArray”中的所有其他用户? (我试图在转换中做到这一点。)

【问题讨论】:

    标签: meteor publish-subscribe


    【解决方案1】:

    你可以使用我开发的包meteor-middleware。它为此提供了一个很好的可插拔 API。因此,您可以将它们一个一个堆叠起来,而不是仅仅提供一个转换。这允许代码重用、权限检查(如根据权限删除或聚合字段)等。

    例如,对于您的特定问题,您可以(在 CoffeeScript 中):

    thing = new PublishEndpoint 'thing', (options) ->
      Collection.find {}
    
    class HideAnArrayMiddleware
      added: (publish, collection, id, fields) =>
        fields.anArray = _.intersection fields.anArray, [publish.userId] if fields.anArray
        publish.added collection, id, fields
    
      changed: (publish, collection, id, fields) =>
        fields.anArray = _.intersection fields.anArray, [publish.userId] if fields.anArray
        publish.changed collection, id, fields
    
    thing.use new HideAnArrayMiddleware()
    

    【讨论】:

      【解决方案2】:

      this answer 中所述,以下是您在发布文档字段之前访问它们的方式:

      // server: publish the rooms collection
      Meteor.publish("rooms", function () {
        var self = this;
        var handle = Rooms.find({}).observeChanges({
          added:   function(id, fields) { self.added("rooms", id, fields); },
          changed: function(id, fields) { self.changed("rooms", id, fields); },
          removed: function(id)         { self.added("rooms", id); },
          }
        });
        self.ready();
        self.onStop(function () { handle.stop(); });
      });
      

      在你的情况下,也许你可以这样做:

      added: function(id, fields) { 
          if (fields.anArray)
              if (fields.anArray.indexOf(self.userId) !== -1)
                  fields.anArray = [self.userId];
              else
                  delete fields.anArray;
          self.added("rooms", id, fields); 
      },
      

      您还必须以类似的方式处理 changed 函数。

      【讨论】:

        【解决方案3】:

        不可能包含或排除数组的元素,因此最好的办法是在文档中为数组中的用户定义一个显式的布尔字段。

        另外,由于服务器上的转换被忽略(请投票给this issue),如果它是动态计算的,您必须在数据库中设置该字段。类似的 SO 问题:123

        另一种方法是定义一个非数据库支持的集合。看看counts-by-room example

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-01-11
          • 1970-01-01
          • 1970-01-01
          • 2016-08-28
          • 2013-03-10
          • 1970-01-01
          • 2014-06-20
          • 2016-05-15
          相关资源
          最近更新 更多