Meteor collection2类型对象

时间:2015-06-21 18:24:51

标签: meteor meteor-collection2

我试图创建一个字段modifiedBy,类型为:Object(对于Meteor用户)。

我看到你可以为自定义对象设置blackbox:true,但是如果我想设置为特定的对象,说组(集合)字段modifiedBy是登录用户,则非常感谢任何指针/帮助。

由于

1 个答案:

答案 0 :(得分:2)

据我所知,您有两种选择:

  • 使用type: String
  • 存储用户ID
  • 按照您的提议对其进行非规范化

按照您的提议对其进行非规范化

要对其进行非规范化,您可以在模式中执行类似的操作:

...
modifiedBy: {
  type: object
}

'modifiedBy._id': {
  type: String,
  autoValue: function () {
    return Meteor.userId()
  }
}

'modifiedBy.username': {
  type: String,
  autoValue: function () {
    return Meteor.user().username
  }
}
...

正如您所指出的,您需要在更改时更新这些属性:

服务器侧

Meteor.users.find().observe({
  changed: function (newDoc) {
    var updateThese = SomeCollection.find({'modifiedBy.username': {$eq: newDoc._id}})
    updateThese.forEach () {
      SomeCollection.update(updateThis._id, {$set: {name: newDoc.profile.name}})
    }
  }
})

使用type: String

存储用户ID

我建议存储用户ID。它更干净,但效果不如其他解决方案。这是你如何做到的:

...
modifiedBy: {
  type: String
}
...

您也可以轻松为此编写Custom Validator。现在检索用户有点复杂。您可以使用transform function来获取用户对象。

SomeCollection = new Mongo.Collection('SomeCollection', {
  transform: function (doc) {
    doc.modifiedBy = Meteor.users.findOne(doc.modifiedBy)
    return doc
  }
})

但是有一个问题:“变换不适用于observeChanges的回调或发布函数返回的游标。”

这意味着要反应性地检索文档,您必须编写一个抽象:

getSome = (function getSomeClosure (query) {
  var allDep = new Tacker.Dependency
  var allChanged = allDep.changed.bind(allDep)
  SomeCollection.find(query).observe({
    added: allChanged,
    changed: allChanged,
    removed: allChanged
  })
  return function getSome () {
    allDep.depend()
    return SomeCollection.find(query).fetch()
  }
})