2013-08-07 13 views
11

'a bağlıdır. Bir koleksiyondan bir "sanal alan" oluşturmak için dönüştürmeyi kullanmak istiyorum. Ancak eklediğim yeni alan (dönüştürme işlevi dahilinde) iade edilen belgeye oldukça fazla veri ekliyor.Meteor Collection Transform: sunucuda mı yoksa istemcide mi yapıldı? veya

Dönüştürme istemcinin içinde gerçekleşiyorsa, bu iyi bir şeydir. Sunucu tarafında yapılırsa, o zaman bant genişliği endişeleri olacaktır.

Bu yüzden, dönüşümün sunucuda mı yoksa istemcide mi yapıldığı veya belgeyi nasıl bulduğum/getirdiğime bağlı mıyım? Eğer toplama veya findOne için bir dönüştürme seçeneği belirlediğinizde, her iki tarafta dönüşümü kullanabilirsiniz

+0

yayımlamak için size dönecektir belgeye bir işlev ekleyemezsiniz, sunucu tarafındaki dönüşümleri eklemenizi sağlar meteor Paketi da vardır aynı değer? Bu şekilde, belki de (sizin) düşündüğünüz problemi çözebilir misiniz? –

+0

Oh evet. Ancak, dönüştürülen dokümanın gerçekten sunucudan istemciye geçip geçmediğini bilmek daha çok ilgilendi. Sadece biraz teknik. – Dave

+0

Dönüştürme işlevinin, belgeyi (veya eşdeğerini) getirdikten sonra uygulandığını unutmayın. 'bul()' imleci döndürecektir. Sonuçlar alındıktan sonra işlev uygulanır. – Sebastian

cevap

23

GÜNCELLEME: Bu sunucuda dönüşümü bir yapmak mümkündür.

Bir Böyle istemci üzerinde dönüşümü sahip olabilir:

return YourCollection.find({}, {transform: function (doc) { 
    doc.test = true; 
    return true; 
}}); 

Meteor (Meteor.publish içinden) yayınlanır sorgularda transform yok sayar. İstemci, belgenin var olmadığı bir belgeyi görür. sunucuda dönüşümleri kullanmak istiyorsanız

bunu yapabilirsiniz:

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(); 

}); 
+0

Harika, Meteor.publish’i de dikkate aldığınız için teşekkür ederiz. Tam olarak bilmem gerekeni cevapladın. – Dave

+0

@Aşağıdaki gibi: "Dönüştürülmüş koleksiyon istemciye gönderilmeyecek", bu yüzden "sanal alanlar" oluşturmanın ve müşterilerin farkında olmamasının mümkün olmadığına karar verebilir miyim? – Hamal000

+0

@ Hamal000, sanal alanlara sahip tamamen sanal belgeler oluşturmak için 'this.added' komutunu kullanabilirsiniz, ancak değişiklikleri 'this.changed' ile kendiniz yönetmelisiniz. Meteor dokümanlarındaki sohbet odaları örneği bunu gösterir – Akshat

1

,

İşlevini
İsteğe bağlı dönüşüm fonksiyonu dönüşümü vb getir. Belgeler, getirme veya findOne'dan döndürülmeden önce ve gözlem, izin verme ve reddetme geri çağrılarına geçilmeden önce bu işlevden geçirilecektir.

seçeneğini dönüşümü ile toplanan ham belgeyi almak gerekiyorsa.

myCollection.findOne({},{transform:null}) 
1

ekleyebilir ve aşağıdaki işlevi kullanabilirsiniz:

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(); 
    }); 
} 

Kullanımı (sunucu tarafı):

Meteor.publishWithTransform("publication-name", function() { 
    aCollection.find({}) 
}, function (item) 
{ 
    item.aField = "something"; 
    return item; 
}); 

Geri Çekilme: yayınlanan belgeyi kaydederseniz, eklenen değişiklikleri de kaydedeceksiniz. Burada müşterinin yayın sırasında "aField" özelliğinin eklendiğine dair bir ipucu yok.

1

Ayrıca, dönüşümü doğrudan koleksiyon tanımında da ekleyebilirsiniz. Not: Yukarıda belirtildiği gibi, bu güncelleme sırasında koleksiyonunuza fazladan veri depolama riski taşır. Salt okunur koleksiyonlar için bu gerçekten bir sorun değil.

Ayrıca bunu paylaşılan bir lib klasöründe veya benzeri bir ortamda yaşamak için bekliyorum, hem istemci hem de sunucu bu tanıma bakın.

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; 

})(); 
İlgili konular