OpaLang:在查询MongoDB 2.6时不受限制

时间:2015-01-06 11:44:02

标签: mongodb opa

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

检查版本:

  • 2.6.5 - 自提交“[version] bumped MongoDb to 2.6.5”,
  • 以来,Opa正式支持
  • 2.6.6 - 最新稳定,
  • 2.6-latest - nightly 5.01.2014,
  • 2.8.0-rc4 - 最新发展。

简化工作示例:

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]会返回所有文档

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

测试前不存在数据库和集合。 我盯着使用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问题。除了从DB获取所有文档和过滤客户端(到许多文档)之外的任何变通方法都是受欢迎的!

1 个答案:

答案 0 :(得分:0)

由具有提交"[fix] mongo: Ensure that the query limit is respected"的MLstate家伙修复。