我想在我的publish方法中修改find()游标中匹配的文档。但是,它不应保存到Mongo中。
示例:
Email.find({})返回类似的文档 {email:“hello@hello.com”}与Mongo集合中的记录相匹配。
但我想做一个额外的步骤,即检查电子邮件是否已经过验证(可能是在另一个集合中,或者是某个逻辑程序,并将其添加为此类。
也就是说,我想发布
{ 电子邮件:“hello@hello.com”, is_verified:true }
虽然Mongo中的文件仍然是{email:“hello@hello.com”}
我该怎么做?谢谢!
答案 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_collection和http://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();
});
这两种方法都可以。