我正在尝试创建一个字段 modifiedBy ,其类型为:对象(对于 Meteor 用户)。
我看到您可以为自定义对象设置 blackbox: true ,但是如果我想设置特定对象,例如组(集合)字段 modifiedBy 是登录用户,非常感谢任何指针/帮助。
谢谢
我正在尝试创建一个字段 modifiedBy ,其类型为:对象(对于 Meteor 用户)。
我看到您可以为自定义对象设置 blackbox: true ,但是如果我想设置特定对象,例如组(集合)字段 modifiedBy 是登录用户,非常感谢任何指针/帮助。
谢谢
据我所知,您有两种选择:
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}})
}
}
})
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()
}
})