2017-06-13 46 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)。这实际上是一件非常有效的事情。 –