2017-06-13 74 views
1

編輯:Asya回答如下,更新爲工作代碼。在節點中排序mongodb客戶端findOne()

我在使用Lambda和Node.js在AWS中構建無服務器應用程序。我目前在mLab有一個MongoDB。我試圖獲取基於ISODate字符串的「最新」記錄。使用findOne()或find w/limit 1,它會每次返回相同的記錄(不是最新的)。

我有2個記錄在我的測試表看起來像:

{ "field1": "myField", "versionTimestamp": "2017-06-13T18:33:06.223Z" } 
{ "field1": "myField", "versionTimestamp": "2017-12-13T18:33:06.223Z" } 

不管我做什麼,它總是返回從6

col.findOne(q, { "sort": [['versionTimestamp', 'desc']] }, function (err, doc) { 
        db.close(); 
        if (err) { 
         sendErrorResponse("500", "Unable to query DB", err); 
        } 
        else { 
         if (doc) { 
          console.log(doc); 
          callback(null, doc.invoiceDocument); 
         } 
         else { 
          sendErrorResponse("404", "Record Not Found", "No records found that match those parameters."); 
         } 
        } 
       }); 

還是一個與限制1

col.find(q, { "limit": 1, "sort": [['versionTimestamp', 'desc']] }).toArray(function (err, docs) { 
       db.close(); 
       if (err) { 
        sendErrorResponse("500", "Unable to query DB", err); 
       } 
       else { 
        if (docs) { 
         console.log(docs[0]); 
         callback(null, docs[0].invoiceDocument); 
        } 
        else { 
         sendErrorResponse("404", "Record Not Found", "No records found that match those parameters."); 
        } 
       } 
      }); 
+1

排序需要排序的喜好陣列,默認是「ASC」。我猜你想要另一組數組括號:[['field','desc']] –

+1

findOne將只會返回匹配查詢條件的第一個文檔(https://docs.mongodb.com/manual/ reference/method/db.collection.findOne /#definition),所以你將不能預先分類返回哪些結果。對於第二種選擇,您是否嘗試將「desc」更改爲「asc」以查看它是否更改了結果?您可能想嘗試使用1/-1。最後,'versionTimestamp'似乎被定義爲字符串而不是日期對象,這是否意味着? –

+1

@AdamHarrison雖然「串」確實可能是一個錯誤,但由於「yyyy-mm-dd」等構造的原因,它們仍然會「詞法排序」。所以來自@asya的評論是正確的,因爲這是一個「語法錯誤」,導致排序規範被誤解。看到[節點文檔](http://mongodb.github.io/node-mongodb-native/2.2/api/Collection.html#findOne) –

回答

1

阿霞找到了!這是一個排序選項中的格式錯誤的數組:

sort需要一個排序首選項數組,默認爲'asc'。我猜 你想另一組數組括號:[[「場」,「遞減」] ] - 阿霞甘維珍昨天

1

Model.findOne沒有方法sort。但是,你可以按你的日期,請用Model.find,(上升或下降),然後限制返回值1與limit方法:

col.find(q).sort(versionTimestamp: -1).limit(1).exec(); 

這裏,sort是一種方法,而不是像方法find的參數q

希望它能幫助,
最好的問候,

+1

這個問題涉及到[節點驅動程序](http://mongodb.github.io/node-mongodb-native/2.2/api/Collection.html#findOne)而不是貓鼬。正如引用的文檔中所指出的那樣,'.findOne()'的確有一個'sort'選項。事實上,因爲貓鼬只是包裝並調用相同的方法,所以它[**確實**實際上也執行它](http://mongoosejs.com/docs/api.html#model_Model.findOne)。這實際上是一件非常有效的事情。 –