【问题标题】:Sorting mongodb client findOne() in node在节点中对 mongodb 客户端 findOne() 进行排序
【发布时间】:2017-06-13 20:40:59
【问题描述】:

我正在使用 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.");
                    }
                }
            });

【问题讨论】:

  • sort 采用一组排序首选项,默认为“asc”。我猜你想要另一组数组括号: [ [ 'field', 'desc'] ]
  • findOne 只会返回与查询条件 (docs.mongodb.com/manual/reference/method/db.collection.findOne/…) 匹配的第一个文档,因此您将无法对返回的结果进行预排序。对于第二个选项,您是否尝试将“desc”更改为“asc”以查看它是否改变了结果?您可能想尝试使用 1 / -1 代替。最后,“versionTimestamp”似乎被定义为字符串而不是日期对象,这是故意的吗?
  • @AdamHarrison 虽然“字符串”确实可能是一个错误,但由于"yyyy-mm-dd" 等结构,它们仍然会“按词法排序”。所以@asya 的评论是正确的,因为这是一个“语法错误”,导致排序规范被误解。见node docs
  • @AdamHarrison 我确实尝试过两种方式进行排序。这是在节点驱动程序中,而不是 mongo shell,所以调用不同。
  • @AsyaKamsky 就是这样!非常感谢。他们现在都可以工作了。

标签: node.js mongodb mongodb-query


【解决方案1】:

阿莎找到了!这是排序选项中的格式错误的数组:

sort 接受一组排序首选项,默认为“asc”。我是 猜测你想要另一组数组括号: [ [ 'field', 'desc'] ] – Asya Kamsky 昨天

【讨论】:

    猜你喜欢
    • 2014-11-10
    • 2011-05-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-27
    • 1970-01-01
    • 1970-01-01
    • 2018-05-06
    • 2018-01-16
    相关资源
    最近更新 更多