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 中不再正常工作。
检查的版本:
- 2.6.5 - 自提交“[version] bumped MongoDb to 2.6.5”、
以来由 Opa 正式支持
- 2.6.6 - 最新稳定版,
- 2.6-最新 - 每晚 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]
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" : ""
}
请注意 ntoreturn
和 nreturned
都具有值 2
。我不确定这是 Opa 还是 Mongo 问题。除了从数据库中获取所有文档和过滤客户端(对许多文档)之外的任何变通方法都是受欢迎的!
已由 MLstate 人员修复并提交 "[fix] mongo: Ensure that the query limit is respected"。
Opa (https://github.com/MLstate/opalang) 两年前使用 MongoDB 2.2 制作的应用程序在 MongoDB 到 2.4 的迁移中幸存下来。不幸的是,数据库查询在 MongoDB 2.6 中不再正常工作。
检查的版本:
- 2.6.5 - 自提交“[version] bumped MongoDb to 2.6.5”、 以来由 Opa 正式支持
- 2.6.6 - 最新稳定版,
- 2.6-最新 - 每晚 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]
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" : ""
}
请注意 ntoreturn
和 nreturned
都具有值 2
。我不确定这是 Opa 还是 Mongo 问题。除了从数据库中获取所有文档和过滤客户端(对许多文档)之外的任何变通方法都是受欢迎的!
已由 MLstate 人员修复并提交 "[fix] mongo: Ensure that the query limit is respected"。