Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何在Meteor.js中的服务器端转换函数之后设置mongo投影?_Javascript_Mongodb_Meteor_Meteor Publications - Fatal编程技术网

Javascript 如何在Meteor.js中的服务器端转换函数之后设置mongo投影?

Javascript 如何在Meteor.js中的服务器端转换函数之后设置mongo投影?,javascript,mongodb,meteor,meteor-publications,Javascript,Mongodb,Meteor,Meteor Publications,在应用需要访问原始文档的转换后,我需要限制从发布函数发送到客户端的字段数 我基本上是在尝试避免向客户端发送潜在的巨大数组,并运行一系列检查以返回一个好的整洁对象 这是我现在得到的函数-它工作,只是不是我想要的方式,基本上限制了观察函数的字段。是否有方法在观察/变换后添加投影 Meteor.publish('network', function() { var self = this; // get the user values initially var user = Mete

在应用需要访问原始文档的转换后,我需要限制从发布函数发送到客户端的字段数

我基本上是在尝试避免向客户端发送潜在的巨大数组,并运行一系列检查以返回一个好的整洁对象

这是我现在得到的函数-它工作,只是不是我想要的方式,基本上限制了观察函数的字段。是否有方法在观察/变换后添加投影

Meteor.publish('network', function() {

  var self = this;

  // get the user values initially
  var user = Meteor.users.findOne(self.userId);
  var followingUsers = user.following ? user.following.users || [] : [];
  var followingChannels = user.following ? user.following.channels || [] : [];

  var transformMedia = function(doc) {
    // get the user each time to keep this publication reactive
    votesUp = doc.votes ? doc.votes.up || [] : [];
    votesDown = doc.votes ? doc.votes.down || [] : [];
    favourites = doc.votes ? doc.votes.favourites || [] : [];

    doc.userActions = {
      votedUp: _.contains(votesUp, doc._id) ? 1 : 0,
      votedDown: _.contains(votesDown, doc._id) ? 1 : 0,
      isFavourite: _.contains(favourites, doc._id) ? 1 : 0,
      played: _.contains(doc.played, self.userId) ? 1 : 0,
    };

    return doc;
  };

  var networkQuery = Media.find({
    $and: [
    {
        $and: [
          {processedAt: { $exists: true} },
          {processedStatus: 'successful'},
          {publishStatus: 'published'}
        ]
      },
      {
        // if created by this user, user they follow or channels they subscribe to
        $or: [
          {createdBy: self.userId },
          {createdBy: { $in: followingUsers} },
          {channels: { $in: followingChannels} },
        ]
      }

      // TODO : add not banned or trashed once implemented
    ]
  }, mediaModifiers).observe({
    added: function(doc) {
      self.added('media', doc._id, transformMedia(doc));
    },
    changed: function(doc, oldDoc) {
      self.changed('media', doc._id, transformMedia(doc));
    },
    removed: function(doc) {
      self.removed('media', doc._id, transformMedia(doc));
    },
  });

  self.onStop(function() {
    networkQuery.stop();
  });

  self.ready();

});
我有。我使用
cursor.observe()
+一个自定义函数(正如您所做的那样)来处理它,我只是添加了一个
\uu.pick()
来过滤不必要的字段。以本出版物代码为例(尤其是白名单
doctoublish
部分):

这段代码是从@datacarl-answer中借来的,以回答我上面提到的主题

请注意,如果扩展到多个服务器,这种方法的缺点是每个服务器都必须运行
cursor.observe()
函数

您还忘了准备好出版物,并在出版物结束时处理您的观察者(可能是因为您没有粘贴所有发布)。它看起来是这样的:

self.ready();
self.onStop(function () {
  networkQuery.stop();
});

请注意,我的字段投影在mongo选择器之后传入的mediaModifier obj中。实际上,我已经停止并准备好了,并在复制和粘贴中成功地错过了它,谢谢-现在就开始尝试一下,我有一个类似的想法,就是在转换中简单地将大量字段设置为空数组-但这感觉更“粗糙”,我更喜欢使用pick-here来白名单字段。我会回来报到的。
self.ready();
self.onStop(function () {
  networkQuery.stop();
});