0

タイプ Object の modifiedBy フィールドを作成しようとしています (Meteor ユーザー向け)。

カスタム オブジェクトに blackbox: true を設定できるようですが、グループ (コレクション) フィールド modifiedBy がログイン ユーザーであると言う特定のオブジェクトに設定したい場合は、ポインタ/ヘルプをいただければ幸いです。

ありがとう

4

1 に答える 1

2

私が見る限り、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 に答える