0

我正在尝试创建一个字段 modifiedBy ,其类型为:对象(对于 Meteor 用户)。

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

谢谢

4

1 回答 1

2

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

  • 将用户 ID 存储在那里type: String
  • 按照您的建议对其进行非规范化

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

要对其进行非规范化,您可以在架构中执行以下操作:

...
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}})
    }
  }
})

将用户 ID 存储在那里type: String

我建议存储用户 ID。它更干净,但性能不如其他解决方案。您可以这样做:

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

您也可以轻松地Custom Validator为此编写一个。现在检索用户有点复杂。您可以使用转换函数来获取用户对象。

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()
  }
})
于 2015-06-21T18:51:19.633 回答