2013-05-22 2 views
9

In der Arbeit mit Meteor.js und Mongo verwende ich die Suche ({einige Argumente}) und manchmal ({einige Argumente}). Fetch(), um Cursor und ein Array von passenden Dokumenten jeweils zurückzugeben.Wie manipuliert zurückgegeben Mongo Sammlungen/Cursor in Javascript (meteor.js)?

Was ist der wahre Unterschied zwischen den beiden? (Wann würde ich eins gegen das andere verwenden?)

Was ist der richtige Weg, um über diese Art von zurückgegebenen Objekten zu manipulieren/iterieren?

z. Ich habe eine Sammlung, die viele Dokumente mit einem Titelfeld hat.

Mein Ziel war es, ein Array aller Titelfelder Werte z. [Doc1title, doc2title, doc3title]

Ich tat dies:

var i, listTitles, names, _i, _len; 
names = Entries.find({}).fetch(); 
listTitles = []; 
for (_i = 0, _len = names.length; _i < _len; _i++) { 
    i = names[_i]; 
    listTitles.push(i.title); 
} 

oder das Äquivalent in Coffeescript

names = Entries.find({}).fetch() 
listTitles = [] 
for i in names 
    listTitles.push(i.title) 

, die funktioniert, aber ich habe keine Ahnung, wenn ihr die richtige Art und Weise oder sogar eine halbwegs vernünftig.

Antwort

14

Ihre erste Frage wurde gestellt before - siehe auch this Beitrag. Die kurze Antwort ist, dass Sie den Cursor verwenden möchten, der von find zurückgegeben wird, außer Sie alle Daten auf einmal wirklich benötigen, um es vor dem Senden zu einer Vorlage zu bearbeiten.

Ihr Coffee wie könnte neu geschrieben:

titles = (entry.title for entry in Entries.find().fetch()) 

Wenn Sie Strich verwenden, könnte es auch so geschrieben werden:

titles = _.pluck Entries.find().fetch(), 'title' 
+2

Danke für den Link zu den Meteor Docs. Als eine Randnotiz, warum oh warum erfanden sie den Namen fetch() zum Erstellen eines Arrays von einem Cursor, wenn es in normalen Mongo zu Array() aufgerufen wird. Es dauerte eine Weile, bis ich herausfand, dass ich keinen normalen Mongo-Cursor, sondern eine Meteorvariante besaß. – Godsmith

10

einfach einen Cursor in js iterieren verwenden cursor.forEach

const cursor = Collection.find(); 
cursor.forEach(function(doc){ 
    console.log(doc._id); 
}); 

Wenn Sie Cursor in Arrays konvertieren, finden Sie auch die .map() Funktion nützlich:

const names = Entries.find(); 
let listTitles = names.map(doc => { return doc.title });