如何在Meteor服务器端添加或删除集合文档字段?

如何在Meteor服务器端添加或删除集合文档字段?,meteor,Meteor,在允许或拒绝方法中插入或更新之前,我需要向文档添加或删除字段。我假设转换函数将提供所需的功能 流星状态 “可选转换函数。文档将通过 在从fetch或findOne返回之前以及 被传递给observe、allow和deny的回调。“ 每当我尝试从函数中转换并返回文档时,无论是从允许还是拒绝,转换后的文档版本都不是插入到mongodb中的版本。我尝试通过两种策略进行转换 战略1 var ts = new Date(); return _.extend(_.pick(doc, 'name', 'di

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

流星状态

“可选转换函数。文档将通过 在从fetch或findOne返回之前以及 被传递给observe、allow和deny的回调。“

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

战略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];   
  } 
});
两者都不起作用。在这两种情况下,虽然添加了字段,但未删除字段

有趣的是,我从insert-allow和insert-deny内部尝试了相同的两种策略,只有策略2起作用。所以,现在我只是使用策略#2内部拒绝插入/更新方法。工作正常,不难接线


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

斯蒂夫您试用过我的收集挂钩软件包吗?听起来像是您需要的

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

最近需要做同样的事情,但在这里找不到任何例子。。。我想分享一下我是如何做到的:

使用


希望这有帮助!:)

我做到了,看起来棒极了。现在我不想接受任何包,因为我担心未来的依赖性问题。如上所述,策略2非常有效。我原以为战略1会奏效。我还认为它可以在允许或拒绝转换函数中工作,但这两种策略都不行。不要担心将来的依赖性问题,软件包和为Meteor编写的任何代码一样容易更新。它们通常会使事情变得更简单。Steeve,收集挂钩只是在Meteor.collection或_collection属性(客户端与服务器)上包装插入/更新/删除。唯一的风险是在将来的Meteor更新中,属性名称(U)集合会发生更改。另外,我应该提到的是,您也不需要meteorite。我个人的选择是直接使用meteor,我根据不同的情况向客户推荐捷运vs meteor。要使用收集钩子,你可以从GitHub下载一个zip文件,并将其放入你本地的
软件包/
文件夹中,然后
meteor添加收集钩子
,甚至将其设置为git子模块。我抵制bcuz,我担心依赖软件包…但这个软件包是rulez!用于从mongo集合架构中删除字段。问题是如何在插入或更新之前添加或删除字段。例如,您可能希望添加创建的时间-日期戳,并且您肯定希望防止恶意尝试添加字段和数据。
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 : '' } } );
        }
    }

}});