2012-12-18 12 views
9

Sto riscontrando alcuni problemi durante il tentativo di ottenere dati da una collezione Meteor e ho bisogno di qualche consiglio.Recupero di dati dalle collezioni Meteor

La raccolta è stata definita, pubblicata e sottoscritta correttamente. Se invio dei dati a un modello, visualizza bene:

Template.Lists.Projects = function(){ 
    return Projects.find(); 
}; 

ma sto cercando di utilizzare i dati prima di visualizzarlo, e questo è dove ho incontrato problemi. Innanzitutto, sto riscontrando alcune incoerenze tra find() e findOne(). find (selector) funziona bene e restituisce un cursore, ma findOne (selector) restituisce "undefined". Sto solo cercando una sola voce, quindi find() sembra non necessario.

Returns LocalCollection.Cursor:

var find = Projects.find({_id: "3fd33eed-9735-4376-860e-3be383beae2f"}); 
console.log(find); 

restituisce undefined:

var find = Projects.findOne({_id: "3fd33eed-9735-4376-860e-3be383beae2f"}); 
console.log(find); 

Il mio prossimo problema sorge quando si utilizza .fetch() sul LocalCollection.Cursor. Restituisce un array vuoto.

var find = Projects.find({_id: "3fd33eed-9735-4376-860e-3be383beae2f"}); 
var fetch = find.fetch(); 
console.log(fetch); 

tutto questo ritorna è la seguente riga:

[]

Quando provo ad indicare una chiave specifica dalla matrice voglio visualizzare, come:

var find = Projects.find({_id: "3fd33eed-9735-4376-860e-3be383beae2f"}); 
var fetch = find.fetch(); 
console.log(fetch.name); 

Restituisce indefinito.

Mi sto ancora familiarizzando con Meteor e non ho mai usato MongoDB (o minimongo), quindi probabilmente sto facendo solo un errore stupido. Se qualcuno me lo segnalasse sarei elettrizzato!

+0

si sta cercando di utilizzare i dati prima di visualizzarli, è possibile farlo con template.templateName.rendered che se il rendering è all'interno di ciascuno, il modello rappresenta i dati stessi, come è possibile utilizzare "questo" , è solo il tuo documento. farò un esempio per dimostrare. – crapthings

risposta

0

se hai rimosso autopublish, cosa succede se pubblichi la raccolta per tutti gli utenti senza utilizzare un nome di pubblicazione?

Meteor.publish null, -> 
    Products.find {} 

dove iscrivi la tua collezione?

modello aiutante

Handlebars.registerHelp = 'products', (id) -> 
    Product.find _id: Session.get 'productId' 

come se abbiamo prezzo in ogni prodotto. la parte di modello si presenta come ...

<template name="products-list"> 
    <div class="products-list"> 
     {{#each products}} 
      {{> product-item}} 
     {{/each}} 
    </div> 
</template> 

<template name="product-item"> 
    <div class="product-item"> 
     {{price}} 
    </div> 
</template> 

parte js, userò CoffeeScript ...

Template['product-item'].price = -> 
    console.log @ # @ is this as it is product itself, if we have product inserted. 
    console.log this 
    return 'the price is: ' + @price 
+0

Ho già eseguito l'autopublish e l'ho pubblicato con successo dal server, sottoscritto dal client e reso in un modello. Non sono davvero sicuro di cosa faccia il codice che hai inserito (parzialmente perché sto usando JavaScript, non CoffeeScript), ma non penso che risolva il mio problema. Voglio solo assegnare le chiavi di una voce specifica alle variabili per essere in grado di manipolarle prima di renderle in un modello. –

+0

non riesco davvero a capire cosa stai cercando di fare, ma hai detto "Ma sto cercando di usare i dati prima di visualizzarli", quindi penso che tu possa manipolare il valore prima che il modello sia reso. – crapthings

+5

Se l'OP utilizza javascript, penso che sia meglio scrivere la risposta anche in javascript, poiché come puoi vedere, rischi di pubblicare una risposta che l'OP non può realmente capire! Per questo motivo, ho downvoted questa risposta. – Rahul

4

Risultati per find() e findOne() sono coerenti. Fondamentalmente, Mongo o Minimongo semplicemente non trovano un documento che corrisponda a _id. FindOne() è esattamente come fare una ricerca (selettore, opzioni) .fetch() [0].

È probabile che il modello Lists.Projects si aspetti una raccolta, un array o un hash su cui iterare. Non è possibile restituire un documento specifico. Se stai utilizzando {{#each Projects}} devi fornire un modo per il modello per iterare non solo un singolo valore.

1

Recentemente ho avuto lo stesso problema, La raccolta find() non restituiva nulla se utilizzata da query.observe.

Il problema era l'ordine dello subscribe delle raccolte.

Per esempio, se si dispone di una collezione chiamata Lists e uno chiamato Projects,

Se stai ricevendo i progetti osservando una query sulle liste, e si doveva:

Meteor.subscribe('Lists'); 
Meteor.subscribe('Projects'); 

quello che succede è viene richiamato il trigger di osservazione della query, ma i progetti non vengono ancora recuperati dal server. Così Projects.find(). Fetch(). Length = 0.

Per risolvere il problema, è sufficiente fare

Meteor.subscribe('Projects');  
Meteor.subscribe('Lists'); 
0

provare in questo modo

Meteor.subscribe('testData', function() { 
    var document = Documents.find(); 
    console.log(document); 
}); 
0

Si sta lavorando sul client e si non sapere mai quando il cliente ha ricevuto tutti i dati necessari. Le tue funzioni possono essere attivate quando le collezioni sono vuote o non ancora sincronizzate. Quindi devi fare una richiesta posticipata al tuo minimongo (quando tutti i dati sono disponibili localmente)

E sì, non puoi accedere a cose quando non sono state renderizzate nel DOM tramite getElementById() o qualcosa del genere ma nel tuo caso provi ad accedere i dati dal minimongo (la tua versione locale di mongodb nel browser) non è il DOM, quindi il tuo modello non è importante qui.

Attendi fino a quando la tua sottoscrizione non è pronta che il tuo minimongo possieda tutti i dati con la richiamata onReady nella tua chiamata di sottoscrizione e attiva le tue funzioni.

https://docs.meteor.com/api/pubsub.html#Meteor-subscribe

callback (funzione o un oggetto).

Opzionale. Può includere onStop e onReady richiamate. Se c'è un errore, viene passato come argomento a onStop. Se viene passata una funzione invece di un oggetto, è interpretato come un callback onReady.