transform を使用して、コレクションから「仮想フィールド」を作成したいと考えています。ただし、(変換関数内に) 追加している新しいフィールドは、返されたドキュメントにかなりの量のデータを追加しています。
変換がクライアント内で行われている場合、これは問題ありません。サーバー側で行う場合、帯域幅の問題があります。
変換がサーバーで行われるのか、クライアントで行われるのか、それともドキュメントの検索/取得方法に依存するのでしょうか?
transform を使用して、コレクションから「仮想フィールド」を作成したいと考えています。ただし、(変換関数内に) 追加している新しいフィールドは、返されたドキュメントにかなりの量のデータを追加しています。
変換がクライアント内で行われている場合、これは問題ありません。サーバー側で行う場合、帯域幅の問題があります。
変換がサーバーで行われるのか、クライアントで行われるのか、それともドキュメントの検索/取得方法に依存するのでしょうか?
UPDATE : サーバー上で変換を行うことができます。
次のように、クライアントで変換を行うことができます。
return YourCollection.find({}, {transform: function (doc) {
doc.test = true;
return true;
}});
Meteor はtransform
、( 内から) 発行されたクエリを無視しますMeteor.publish
。クライアントには、変換が存在しないかのようにドキュメントが表示されます。
サーバーで変換を使用する場合は、次のようにします。
YourCollection = new Mongo.Collection("collection_name");
Meteor.publish("yourRecordSet", function() {
//Transform function
var transform = function(doc) {
doc.date = new Date();
return doc;
}
var self = this;
var observer = YourCollection.find().observe({
added: function (document) {
self.added('collection_name', document._id, transform(document));
},
changed: function (newDocument, oldDocument) {
self.changed('collection_name', newDocument._id, transform(newDocument));
},
removed: function (oldDocument) {
self.removed('collection_name', oldDocument._id);
}
});
self.onStop(function () {
observer.stop();
});
self.ready();
});
次の関数を追加して使用できます。
Meteor.publishWithTransform = function(publicationName, cursorGetter , transform)
{
transform = transform || function(o){return o;};
Meteor.publish(publicationName, function ()
{
var cursor = cursorGetter.apply(this, arguments);
var collectionName = cursor._cursorDescription.collectionName;
var self = this;
var observer = cursor.observe({
added: function (document) {
self.added(collectionName, document._id, transform(document));
},
changed: function (newDocument, oldDocument) {
self.changed(collectionName, newDocument._id, transform(newDocument));
},
removed: function (oldDocument) {
self.removed(collectionName, oldDocument._id);
}
});
self.onStop(function () {
observer.stop();
});
self.ready();
});
}
使用法 (サーバー側):
Meteor.publishWithTransform("publication-name", function () {
aCollection.find({})
}, function (item)
{
item.aField = "something";
return item;
});
欠点: 公開されたドキュメントを保存すると、追加された変更も保存されます。ここでクライアントは、パブリケーション中にプロパティ「aField」が追加されたことを知りません。
https://atmospherejs.com/maximum/server-transformを公開するためにサーバー側に変換を追加できる流星パッケージもあります
コレクション定義に変換を直接追加することもできます。注: 前述のように、更新時にコレクションに余分なデータが保存されるリスクがあります。読み取り専用コレクションの場合、これは実際には問題になりません。
また、これが共有 lib フォルダーなどに存在することを期待しています。クライアントとサーバーの両方がこの定義を参照します。
var Assignment;
// Every record in this collection will now be an
// instance of the Assignment class.
this.AssignmentsReport = new Mongo.Collection("assignments", {
transform: function(doc) {
return new Assignment(doc._id, doc.assignId, doc.masterId);
}
});
// Creating a class instance to actually map the new object.
Assignment = (function() {
function Assignment(_id, assignId, masterId) {
var assign, ref;
this._id = _id;
this.assignId = assignId;
this.masterId = masterId;
this.assign = (ref = Assignments.find({
_id: this.assignId
}).fetch()) != null ? ref[0] : void 0;
}
return Assignment;
})();