Meteor:发布2个不同的数组元素投影

时间:2015-10-19 18:40:11

标签: mongodb meteor

我在集合中有像这样的元素:

{
    array: [{ a:10, b: {...} }, { a:30, b: {...} }, { a:50 b: {...} }]
}

在一个可以返回数百个结果的出版物中,我将数组投影到 只有a字段且重量较轻:

return Col.find({}, { fields: { 'array.a': 1 } })

在另一篇文章中,我发布了一份完整的文档:

return Col.find({ _id: ObjectId(...) })

第二个出版物缺少从每个数组项中排除的字段 第一个出版物,有时。刷新页面(可能正在改变 订阅的顺序?)修复了错误。

如何在我的大型出版物中发布简化数组项目,并且完整 单一出版物中的元素?

1 个答案:

答案 0 :(得分:1)

我研究了不同的方法。问题可以通过仔细挑选字段和注意订阅顺序逐个解决,但这些解决方案很脆弱,依赖于未记录的任意条件。

唯一真正的通用解决方案是虚拟馆藏。最简单的情况是简单地在不同的客户端集合名称下发布游标。例如:

function publishVirtual(sub, name, cursor) {
  var observer = cursor.observeChanges({
    added  : function(id, fields) { sub.added(name, id, fields) },
    changed: function(id, fields) { sub.changed(name, id, fields) },
    removed: function(id)         { sub.remove(name, id) }
  })

  sub.onStop(function() {
    observer.stop() // important. Otherwise, it keeps running forever
  })
}

然后,在您的出版物中,而不是返回cursor

var cursor = Users.find()
publishVirtual(this, 'virtualUsers', cursor)
this.ready()