2012-07-19 39 views
5

我正在開發一個通過mongo本機連接器連接到mongodb的nodejs中的web應用程序。如何排序結果在nodejs - mongodb搜索,但通過調用動態方法

在我的js文件之一,我有一個通用的方法來調用「查找」或「findOne」操作來獲取無論我從MongoDB中收集所需要的,是這樣的:

它工作正常的我。

但是現在,我需要對結果進行排序,並且據我所知,Mongodb使用「sort」方法來實現這一點。

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

在一個簡單的查詢,這應該是這樣的: 例如:

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

我不知道該怎麼稱呼「排序」的方法,這樣做即時通訊我的通用方法。

任何想法?

謝謝。

+0

你可以給一個關於你在找什麼的更多細節? – 2012-07-19 11:58:04

+0

對不起,我修改了我的問題。希望能幫助到你。 – larrytron 2012-07-19 13:35:54

回答

0

我找到了解決方案。

看來「toArray」不見了,否則不起作用。

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) { 
      ... 
     } 
} 

我希望這將是有益的

5

你看過mongojs(https://github.com/gett/mongojs)嗎?我使用這個爲我的節點應用程序,它很好地工作(我也使用expressjs)。你可以用下面的語法做了一個簡單的查找和排序:

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

謝謝。這當然是有效的。但我需要更復雜的東西。根據參數調用此方法dinamically,(find或findOne)。 – larrytron 2012-07-19 14:53:49

+1

它說排序()只需要1參數 – 2016-11-18 07:32:21

+0

這根據unix時間戳字段對結果按照最新到最舊的順序排序:'articles.find()。sort({created:-1})。toArray()'(using promise語法) – agm1984 2017-09-07 01:49:37

1

你就不能做同樣的事情,以你的電話?:

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

如果排序不僅可以輸出被應用到find的結果,而不是findOne,那麼它是一個比較複雜:

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

(即最後完全是未經檢驗的,當然,不過看起來應該是CL )

+0

這幾乎是我所需要的,但根本不是。用新的detals寫新帖子。 – larrytron 2012-07-20 08:04:02

0

它應該幾乎就像斯科特說的那樣。

第一種方法不起作用,導致排序被未定義的對象調用。 我認爲這是有道理的,因爲有一個回調是首先執行.. 第二種方法幾乎是我所需要的,但不工作,再次,findResults.sort返回一個未定義的。

我終於做了一件更加容易,它似乎成功,但......還是有若有所失:

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

很好,它將暫停在「results.sort」,它仍然在等待..我不知道是什麼。 看着mongodb控制檯,沒有查詢啓動。另一方面,回調作爲函數存在,但不叫...

然後,我試圖以另一種方式做到這一點;

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

在這種情況下,執行繼續,但它會返回未分類的結果。

還有其他想法嗎?它必須在那裏....

謝謝

+0

這仍然不起作用。任何想法? – larrytron 2012-08-02 07:34:36

1

使用遊標是最好的解決方案,因爲排序是MongoDB中發動機processeced

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

我有,我想按類別進行搜索的物品模型並獲得基於創建日期的最新文章,這是我該怎麼做

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