我有一个UI元素框架,它只适用于特定的数据模型(期望一个带有“text”键的对象)。这与我的mongodb中存在的数据模型不同。 所以我的第一个想法是使用投影并将其发布给听众。
var db = MongoInternals.defaultRemoteCollectionDriver().mongo.db;
db.Element.aggregate({$project: { _id:1, text:"$description"}});
问题是这不是游标,而只是简单的ejson对象。我应该使用什么策略来提供UI框架所需的数据,并从双方获得反应/数据绑定。
答案 0 :(得分:1)
在您的出版物中,您可以使用较低级别的发布API来更好地控制结果,而不是返回光标。
例如,当您从发布中返回游标时,Meteor会调用_publishCursor函数,如下所示:
Mongo.Collection._publishCursor = function (cursor, sub, collection) {
var observeHandle = cursor.observeChanges({
added: function (id, fields) {
sub.added(collection, id, fields);
},
changed: function (id, fields) {
sub.changed(collection, id, fields);
},
removed: function (id) {
sub.removed(collection, id);
}
});
// We don't call sub.ready() here: it gets called in livedata_server, after
// possibly calling _publishCursor on multiple returned cursors.
// register stop callback (expects lambda w/ no args).
sub.onStop(function () {observeHandle.stop();});
// return the observeHandle in case it needs to be stopped early
return observeHandle;
};
因此,您可以修改您的出版物,基本上做同样的事情,但也可以发布一个文本字段,它从描述字段中获取其值,如下所示:
鉴于以下收集:
MyCollection = new Mongo.Collection("my_collection");
您的发布功能可能如下所示:
Meteor.publish("myPub", function () {
var sub = this;
var observeHandle = myCollection.find().observeChanges({
added: function (id, fields) {
fields.text = fields.description; // assign text value here
sub.added("my_collection", id, fields);
},
changed: function (id, fields) {
fields.text = fields.description; // assign text value here
sub.changed("my_collection", id, fields);
},
removed: function (id) {
sub.removed("my_collection", id);
}
});
sub.ready()
// register stop callback (expects lambda w/ no args).
sub.onStop(function () {observeHandle.stop();});
};