2012-07-19 11 views
5

Zajmuję się tworzeniem aplikacji sieciowej w nodejs połączonej z mongodb poprzez złącze mongo native.W jaki sposób sortuje wyniki w wyszukiwarce nodejs - mongodb, ale wywołując metodę dynamiczną

W jednym z moich plików js, mam metoda rodzajowa do wywołania „znaleźć” lub „findOne” operację odzyskać cokolwiek muszę z kolekcji MongoDB, tak:

To działa dobrze dla mnie.

Ale teraz, muszę sortować wyniki, i o ile wiem, Mongodb używa metody "sort", aby to osiągnąć.

collection.ensureIndex(indexedFields, function(error, indexName) { 
    if (error) { 
     callback(error); 
    } else { 
     var operation = (params.options.one) ? collection.findOne : collection.find; 

     operation.call(collection, params.selector, params.fields, params.options, 
      function(error, result){ 
       if (error) { 
        ... 
       } else { 
        ... 
       }  
      } 
     ); 
    } 
}); 

W prostej kwerendy, to powinno być tak: Na przykład:

collection.find().sort({field : 1}), 

nie wiem jak nazwać „sort” metoda, to robi im mój ogólny sposób.

Wszelkie pomysły?

Dzięki.

+0

Czy możesz podać trochę więcej szczegółów na temat tego, czego szukasz? –

+0

Przepraszam, zmieniłem moje pytanie. Mam nadzieję, że to pomoże. – larrytron

Odpowiedz

0

Znalazłem rozwiązanie.

Wygląda na to, że "toArray" zniknął, w przeciwnym razie nie działa.

operation.call(collection, params.selector, params.fields, params.options, function(error, result) { 
if (error) { 
    callback(error); 
} else { 
     result.sort(params.sort).toArray(function(error, items) { 
      ... 
     } 
} 

Mam nadzieję, że będzie pomocny

5

Czy zapoznałeś się z mongojs (https://github.com/gett/mongojs)? Używam tego dla moich aplikacji węzła i działa ładnie (używam również expressjs). Można zrobić prosty znaleźć i sortować według następującej składni:

db.test.find().sort({name:1}, function(error, tuples) { console.log(tuples) }); 
+0

dzięki. To działa oczywiście. Ale potrzebuję czegoś bardziej złożonego. Nazwij tą metodę dinamicznie (find lub findOne) w zależności od paramu. – larrytron

+1

mówi, że sort() zajmuje tylko 1 argument –

+0

Posortowałem moje wyniki w kolejności od najnowszych do najstarszych na podstawie pola znacznika unix: 'articles.find(). Sort ({created: -1}). ToArray()' (używając obietnicy składnia) – agm1984

1

nie można po prostu zrobić to samo z wyjściem rozmowy ?:

 operation.call(collection, params.selector, params.fields, params.options, 
      function(error, result){ 
       ... 
      } 
     ).sort({field: 1}); 

Jeżeli porządek może tylko należy stosować się do wyników find i nie findOne, to jest nieco bardziej skomplikowana:

var operation = (params.options.one) ? collection.findOne : function() { 
     var findResults = collection.find.apply(this, [].slice.call(arguments)); 
     return findResults.sort({field: 1}); 
    }; 

(Ten ostatni jest całkowicie niesprawdzone, oczywiście, ale wygląda na to powinno być cl ose.)

+0

To prawie to, czego potrzebuję, ale w ogóle nie. Nakładam nowy post z nowymi wypłatami. – larrytron

0

Powinno być prawie tak, jak powiedział Scott.

Pierwsza metoda nie działa, ponieważ sort jest wywoływany przez niezdefiniowany obiekt. Myślę, że to ma sens, ponieważ jest wywołanie zwrotne, które jest wykonywane najpierw .. Druga metoda jest prawie to, czego potrzebuję, ale nie działa, po raz kolejny findResults.sort zwraca undefined.

I wreszcie zrobił coś bardziej łatwe, na jakie wygląda, aby odnieść sukces, ale ... jest jeszcze coś brakuje:

operation.call(collection, params.selector, params.fields, params.options,    
    function(error, result){ 
     if (err) .... 
     else results.sort({field:1}, callback(err, sortedResults)) 
    } 

dobrze, to wstrzymuje się „results.sort” i pozostaje oczekiwanie .. Nie wiem co. Patrząc na konsolę mongodb, nie uruchomiono zapytania. Z drugiej strony callback istnieje jako funkcja, ale nie nazywa się ...

Potem próbowałem zrobić to w inny sposób;

var sortedResults = results.sort({field:1}; 
callback(err, sortedResults) 

W takim przypadku wykonanie jest kontynuowane, ale zwraca nieposortowane wyniki.

Jakieś inne pomysły? To musi tam być ....

dziękuję

+0

To nadal nie działa. Dowolny pomysł? – larrytron

1

użyciem kursorów jest najlepszym rozwiązaniem, ponieważ sortowanie jest processeced w silniku MongoDB

var grades = db.collection('data'); 

var cursor = grades.find(); 
// cursor.skip(1); 
// cursor.limit(4); 
// cursor.sort(['State', 1]); 
cursor.sort([['Temperature', 'desc'],['State','asc']]); 

//var options = { 'skip' : 1, 
//    'limit' : 4, 
//    'sort' : [['grade', 1], ['student', -1]] }; 
//var cursor = grades.find({}, {}, options); 

cursor.each(function(err, doc) { 
    if(err) throw err; 
    if(doc == null) { 
     return db.close(); 
    } 
    console.dir(doc); 
}); 
1

Mam artykułów modelu, gdzie chcę, aby szukać według kategorii i pobierz najnowszy artykuł w oparciu o utworzoną datę i tak to robię:

const query = {category: "category1"}; 
Articles.find(query, callback).sort({created_date: -1}); 
Powiązane problemy