【问题标题】:How do I add or remove collection document fields server side in Meteor?如何在 Meteor 中添加或删除集合文档字段服务器端?
【发布时间】:2013-10-26 16:55:59
【问题描述】:

我需要在允许或拒绝方法中插入或更新之前向文档添加或删除字段。我曾假设转换函数会提供所需的功能。

流星文档状态

"一个可选的转换函数。文件将通过 此函数在从 fetch 或 findOne 返回之前以及之前 被传递给观察、允许和拒绝的回调。”

每当我尝试转换并从函数返回文档时,无论是允许还是拒绝文档的转换版本都不是插入到 mongodb 中的内容。我尝试通过 2 种策略进行转型。

策略 1

var ts = new Date(); 
return _.extend(_.pick(doc, 'name', 'discounts', 'locations', 'url_map', 'client_updated_td', '_id'), {   created_td:
ts,   updated_td: ts,  });

策略 2

// Discountsroutings.fields is in /lib/Discountroutings.js
Discountsroutings.fields = ['_id', 'created_td', 'updated_td', 'client_updated_td', 'name', 'discounts', 'locations', 'url_map'];

// this is in /server/discountsroutings.js var ts = new Date();
doc.created_td = ts; doc.updated_td = ts; return _.each(doc,function(value, key, list){  
  if(Discountsroutings.fields.indexOf(key)  == -1 ){
    delete doc[key];   
  } 
});

都没有用。在这两种情况下,虽然添加了字段,但并未删除字段。

有趣的是,我在插入允许和插入拒绝中尝试了相同的两种策略,但只有策略 #2 有效。所以,现在我只是在拒绝插入/更新方法中使用 Strategy #2。工作正常,连接起来并不难。

我这样做正确吗?我想以正确的方式从收集服务器端添加或删除字段。

【问题讨论】:

    标签: meteor


    【解决方案1】:

    Steeve 你试过我的收藏钩子包了吗?听起来像你需要的

    【讨论】:

    • 我做到了,它看起来很棒。现在我不想接受任何包,因为我担心未来的依赖问题。如上所述,策略 #2 效果很好。我认为策略 #1 会奏效。我还认为它可以在允许或拒绝转换功能中工作,但两种策略都不能。
    • 不用担心未来的依赖问题,软件包就像你为 Meteor 编写的任何代码一样容易更新。他们经常让事情变得更容易。
    • Steeve,collection-hooks 只是包装了 Meteor.Collection 或 _collection 属性(客户端与服务器)上的插入/更新/删除。唯一的风险是属性名称 _collection 在未来 Meteor 更新中发生变化。
    • 我要提的另一件事——你也不需要陨石。我个人的选择是直接使用流星,我根据不同情况向客户推荐mrt vs流星。要使用集合挂钩,您可以从 GitHub 以 zip 的形式下载,然后将其放入您的本地 packages/ 文件夹然后 meteor add collection-hooks,甚至将其设置为 git 子模块。
    • 我拒绝了,因为我担心依赖包...但是这个包规则!
    【解决方案2】:

    您似乎知道要删除的字段列表。那么为什么不使用$set$unset 来添加和删除字段呢?

    【讨论】:

    • 用于从 mongo 集合模式中删除字段。问题实际上是如何在插入或更新之前添加或删除字段。例如,您可能想要添加创建的时间戳,并且您肯定想要防止恶意尝试添加字段和数据。
    【解决方案3】:

    最近需要做同样的事情,但这里没有找到示例......我想分享一下我是如何做到的:

    使用

    • https://atmospherejs.com/matb33/collection-hooks
    • http://arasatasaygin.github.io/is.js/

      Prospects.before.update(function (userId, doc, fieldNames, modifier, options) {
      
      
      //check existence of other segment property and make sure to delete it if segment is updated from 'Other...' to something else
      if (is.existy(doc.other_segment)) {
          var segment = Segments.findOne({_id: modifier.$set.segment});
      
          if (is.not.undefined(segment) && is.not.empty(segment)) {
              if (is.not.equal(segment.name, 'Other...')) {
                  Prospects.update( {_id: doc._id} , {$unset: { other_segment : '' } } );
              }
          }
      
      }});
      

    希望这会有所帮助! :)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-29
      • 2018-02-03
      • 2019-05-29
      • 2017-06-30
      • 2017-04-17
      相关资源
      最近更新 更多