タイプ Object の modifiedBy フィールドを作成しようとしています (Meteor ユーザー向け)。
カスタム オブジェクトに blackbox: true を設定できるようですが、グループ (コレクション) フィールド modifiedBy がログイン ユーザーであると言う特定のオブジェクトに設定したい場合は、ポインタ/ヘルプをいただければ幸いです。
ありがとう
タイプ Object の modifiedBy フィールドを作成しようとしています (Meteor ユーザー向け)。
カスタム オブジェクトに blackbox: true を設定できるようですが、グループ (コレクション) フィールド modifiedBy がログイン ユーザーであると言う特定のオブジェクトに設定したい場合は、ポインタ/ヘルプをいただければ幸いです。
ありがとう
私が見る限り、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
。ユーザーの取得はもう少し複雑です。変換関数を使用してユーザー オブジェクトを取得できます。
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()
}
})