2013-05-22 11 views
9

W pracy z Meteor.js i Mongo używam find ({niektóre argumenty}) i czasami znajduję ({niektóre argumenty}) .fetch(), aby zwracać odpowiednio kursory i tablicę pasujących dokumentów.jak manipulować zwróconymi kolekcjami Mongo/kursorami w javascript (meteor.js)?

Jaka jest prawdziwa różnica między tymi dwoma elementami? (kiedy chciałbym użyć jednego w porównaniu do drugiego?)

Jaki jest właściwy sposób manipulowania/iteracji nad tymi typami zwracanych obiektów?

E.g. Mam kolekcję, która ma wiele dokumentów, każdy z pola tytułu.

Moim celem było uzyskanie tablicy wszystkich wartości pól tytułu, np. [Doc1title, doc2title, doc3title]

Zrobiłem to:

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

lub równowartość w coffeescript

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

który działa, ale nie mam pojęcia, czy jego właściwy sposób lub nawet na wpół rozsądny sposób.

Odpowiedz

14

Twoje pierwsze pytanie zostało zadane before - patrz także this post. Krótka odpowiedź brzmi, że chcesz użyć kursora zwróconego przez find, chyba że naprawdę potrzebujesz wszystkich danych naraz, aby manipulować nim przed wysłaniem do szablonu.

Twój coffeescript może być zapisane jako:

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

Jeśli używasz podkreślenia, może to również być zapisany jako:

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

Dzięki za link do meteor docs. Na marginesie, dlaczego oh, dlaczego wymyślili nazwę fetch() do tworzenia tablicy od kursora, gdy jest wywoływana doArray() w normalnym Mongo. Zajęło mi sporo czasu, zanim zorientowałem się, że nie mam normalnego kursora Mongo, ale zamiast tego wariantu meteorytów. – Godsmith

10

iteracyjne nad kursorem w JS wystarczy użyć cursor.forEach

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

Podczas konwersji kursorów na tablice znajdziesz także .map() funkcja przydatna:

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