2014-11-26 5 views
6

Ho una situazione in cui devo iscrivermi alla stessa raccolta due volte. I due metodi di pubblicare nel mio codice lato server sono i seguenti:Meteor - abbonati alla stessa raccolta due volte - tieni separati i risultati?

Meteor.publish("selected_full_mycollection", function (important_id_list) { 
    check(important_id_list, Match.Any); // should do better check 
    // this will return the full doc, including a very long array it contains 
    return MyCollection.find({ 
     important_id: {$in: important_id_list} 
    }); 
}); 
Meteor.publish("all_brief_mycollection", function() { 
    // this will return all documents, but only the id and first item in the array 
    return MyCollection.find({}, {fields: { 
     important_id: 1, 
     very_long_array: {$slice: 1} 
    }}); 
}); 

mio problema è che io non sto vedendo i documenti completi sul lato client dopo mi abbono a loro. Penso che questo sia dovuto al fatto che sono sovrascritti dal metodo che pubblica solo le brevi versioni.

Non voglio intasare la memoria del mio client con array lunghi quando non ne ho bisogno, ma li voglio disponibili quando ne ho bisogno.

La versione breve è sottoscritta all'avvio. La versione completa è sottoscritta quando l'utente visita un modello che esegue il drill down per ottenere ulteriori informazioni.

Come posso gestire correttamente questa situazione?

risposta

3

TL/DR - saltare al terzo paragrafo.

Suppongo che ciò sia dovuto al fatto che la funzione di pubblicazione ritiene che il campo very_long_array sia già stato inviato al client, pertanto non lo invia di nuovo. Dovresti smanettare un po 'per confermarlo, ma l'invio di dati diversi sullo stesso campo è destinato a causare alcuni problemi.

In termini di sottoscrizione su due raccolte, non si dovrebbe essere in grado di farlo poiché il nome della raccolta di mongo univoco deve essere fornito al client e all'oggetto di raccolte lato server. In pratica, è possibile che sia in grado di fare qualcosa di veramente intrusivo rendendo un abbonamento client un falso remote subscription via DDP e facendolo popolare in un oggetto Javascript completamente separato. Tuttavia, questa non può essere l'opzione migliore.

Questa situazione potrebbe essere risolta pubblicando il riepilogo su qualcosa di diverso dallo stesso campo. Purtroppo, non è possibile utilizzare le trasformazioni al ritorno cursori da una funzione pubblica (che sarebbe il modo più semplice), ma avete due opzioni:

  1. Utilizzare i low-level publications API come descritto nella this answer.
  2. Utilizzare collection hooks per popolare un altro campo (come very_long_array_summary) con il primo elemento nell'array ogni volta che cambia very_long_array e pubblicare solo il campo di riepilogo nella pubblicazione precedente.
1

Una terza opzione potrebbe pubblicare la versione lunga in una raccolta diversa che esiste solo per questo scopo sul client. Potresti voler controllare il capitolo "Advanced Pub/Sub" di Discover Meteor (ultimo sottocapitolo).

+0

Link più preciso: https://book.discovermeteor.com/chapter/advanced-publications Mi ha aiutato a ottenere risultati simili. – oles

Problemi correlati