我试图创建一个字段modifiedBy,类型为:Object(对于Meteor用户)。
我看到你可以为自定义对象设置blackbox:true,但是如果我想设置为特定的对象,说组(集合)字段modifiedBy是登录用户,则非常感谢任何指针/帮助。
由于
答案 0 :(得分:2)
据我所知,您有两种选择:
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
。现在检索用户有点复杂。您可以使用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()
}
})