OpaLang:在 MongoDB 2.6 的查询中不遵守限制

OpaLang: Limit not respected in query to MongoDB 2.6

Opa (https://github.com/MLstate/opalang) 两年前使用 MongoDB 2.2 制作的应用程序在 MongoDB 到 2.4 的迁移中幸存下来。不幸的是,数据库查询在 MongoDB 2.6 中不再正常工作。

检查的版本:

简化的工作示例:

type Article.t = {
  int id
}
database nadzieja_test {
  Article.t /article[{id}]
}
module Model {
  function get_articles() {
    /nadzieja_test/article[limit 2].{id}
    |> DbSet.iterator
    |> Iter.to_list
    |> List.mapi(function(i, item) {
      s = "get_articles()#{i}: id={item.id}" + "\n"
      jlog(s)
      s
    }, _)
  }
}
function page() {
  [1,2,3,4,5,6,7,8,9]
  |> List.iter(
    function (id) {
      /nadzieja_test/article[{~id}] = {~id}
    }, _)
  <pre>{Model.get_articles()}</pre>
}
Server.start(Server.http, { title: "Test", ~page })

查询[limit 2]returns全部文档.

现实生活中的问题显然更复杂(文档存储和查询)但结果相同。原始集合使用索引,但删除它们并没有解决问题。

数据库和集合在测试前不存在。 我开始使用 db.setProfilingLevel(2) 在 mongo 控制台中启用分析(我的应用程序在启用和禁用分析的情况下进行了测试)。获得的分析结果:

> db.system.profile.find({"op":"query","ns":"nadzieja_test.article"}).sort({ts:-1}).pretty()
{
    "op" : "query",
    "ns" : "nadzieja_test.article",
    "query" : {

    },
    "cursorid" : 152008290160,
    "ntoreturn" : 2,
    "ntoskip" : 0,
    "nscanned" : 2,
    "nscannedObjects" : 2,
    "keyUpdates" : 0,
    "numYield" : 0,
    "lockStats" : {
        "timeLockedMicros" : {
            "r" : NumberLong(278),
            "w" : NumberLong(0)
        },
        "timeAcquiringMicros" : {
            "r" : NumberLong(11),
            "w" : NumberLong(8)
        }
    },
    "nreturned" : 2,
    "responseLength" : 88,
    "millis" : 0,
    "execStats" : {
        "type" : "PROJECTION",
        "works" : 3,
        "yields" : 0,
        "unyields" : 0,
        "invalidates" : 0,
        "advanced" : 2,
        "needTime" : 0,
        "needFetch" : 0,
        "isEOF" : 0,
        "children" : [
            {
                "type" : "COLLSCAN",
                "works" : 3,
                "yields" : 0,
                "unyields" : 0,
                "invalidates" : 0,
                "advanced" : 2,
                "needTime" : 1,
                "needFetch" : 0,
                "isEOF" : 0,
                "docsTested" : 2,
                "children" : [ ]
            }
        ]
    },
    "ts" : ISODate("2015-01-06T11:05:26.170Z"),
    "client" : "127.0.0.1",
    "allUsers" : [ ],
    "user" : ""
}

请注意 ntoreturnnreturned 都具有值 2。我不确定这是 Opa 还是 Mongo 问题。除了从数据库中获取所有文档和过滤客户端(对许多文档)之外的任何变通方法都是受欢迎的!

已由 MLstate 人员修复并提交 "[fix] mongo: Ensure that the query limit is respected"