在发布之前,如何在find()中修改对象级别的文档?

时间:2013-07-13 16:52:48

标签: javascript mongodb meteor

我想在我的publish方法中修改find​​()游标中匹配的文档。但是,它不应保存到Mongo中。

示例:

Email.find({})返回类似的文档 {email:“hello@hello.com”}与Mongo集合中的记录相匹配。

但我想做一个额外的步骤,即检查电子邮件是否已经过验证(可能是在另一个集合中,或者是某个逻辑程序,并将其添加为此类。

也就是说,我想发布

{     电子邮件:“hello@hello.com”,     is_verified:true }

虽然Mongo中的文件仍然是{email:“hello@hello.com”}

我该怎么做?谢谢!

2 个答案:

答案 0 :(得分:1)

var Docs = new Meteor.Collection('docs', {

     transform: function(doc) {

         ...
         return anythingYouWant;
     },

});

var docs = Docs.find({...}, {

     transform: function(doc) {

         ...
         return anythingYouWant;
     },

});

请参阅http://docs.meteor.com/#meteor_collectionhttp://docs.meteor.com/#find

答案 1 :(得分:0)

Meteor docs中所述,如果您仔细阅读,transform不是解决所问问题的正确方法:

  

文档将在返回之前通过此函数传递   从 fetch或findOne 中获取,然后传递给   观察,映射,forEach,允许和拒绝。 不应用转换   watchChanges的回调或从发布返回的游标   功能

转换出版物中文档的正确解决方案是使用maximum:server-transform之类的包:

$ meteor add maximum:server-transform
Meteor.publishTransformed('allDocsTransformed', function() {
  return Docs.find().serverTransform({
    extraField: function(doc) {
      // use fields from doc if you need to
      return 'whatever';
    }
  });
});
通过编写自定义出版物来

...或 DIY ,在这种情况下,您可以使用观察者来处理文档流,就像这样:

function transform(doc) {
  doc.extraField = 'whatever';
  return doc;
}

Meteor.publish('allDocsTransformed', function() {
  const observer = Docs.find({}).observe({
    added: (doc) => {
      this.added('collectionName', doc._id, transform(doc));
    },
    changed: (doc) => {
      this.changed('collectionName', doc._id, transform(doc));
    },
    removed: (doc) => {
      this.removed('collectionName', doc._id);
    }
  });

  this.onStop(() => observer.stop());
  this.ready();
});

这两种方法都可以。