好的,我找到了以下解决方法。我没有处理出版物,而是简单地添加了一个我根据其他集合更新的新集合。为了做到这一点,我使用了流星钩子包
function transformDocument(doc)
{
doc.aField = "aValue"; // do what you want here
return doc;
}
ACollection.after.insert(function(userId, doc)
{
var transformedDocument = transformDocument(doc);
AnotherCollection.insert(transformedDocument);
});
ACollection.after.update(function(userId, doc, fieldNames, modifier, options)
{
var transformedDocument = transformDocument(doc);
delete transformedDocument._id;
AnotherCollection.update(doc._id,{$set:transformedDocument});
});
ACollection.after.remove(function(userId, doc)
{
AnotherCollection.remove(doc._id);
});
然后我有了新的集合,我可以以常规方式发布子集
好处:
- 您可以将任何您想要的内容过滤到此数据库中,无需担心该字段是虚拟的还是真实的
- 每次数据库更改时只有一次操作。这样可以避免多个出版物合并相同的数据
洞穴吃:
- 这需要一个集合 = 更多空间
- 2 db 可能并不总是同步,这有几个原因:
- 客户端手动更改“AnotherCollection”的数据
- 在添加“AnotherCollection”之前,您在“ACollection”中有文档。
- 转换函数或源集合架构在某些时候发生了变化
要解决这个问题:
AnotherCollection.allow({
insert: function () {
return Meteor.isServer;
},
update: function () {
return Meteor.isServer;
},
remove: function () {
return Meteor.isServer;
}
});
并在流星启动时同步(即从头开始构建集合)。仅在维护或添加此新集合之后执行此操作。
Meteor.startup(function()
{
AnotherCollection.remove({});
var documents = ACollection.find({}).fetch();
_.each(documents, function(doc)
{
var transformedDocument = transformDocument(doc);
AnotherCollection.insert(transformedDocument);
});
});