【发布时间】:2014-07-13 18:34:33
【问题描述】:
我想知道如何在不实际执行数据库查询的情况下执行以下操作.. 即我想知道“someData”是否会通过“whereClause”而不将其放入表中并再次要求返回. IE。运行 findOne 内部的逻辑,无需插入和选择的开销。只是为了让它更有趣,请考虑我需要让它线程安全,这就是为什么我弄乱了下面的 Guid 有点东西.. 另外请注意 where 子句可能会比下面的更复杂,比如 { a : { $ne : 1 } }
给定来源:
someData = { a: 1, b: 2 };
whereClause = { b: 2 };
我需要修复的代码:
someData.GUID = ObjectId();
// DB QUERY - insert
db.workspace.insert(someData);
whereClause.GUID = inputsValues.GUID;
// Check if the data passes the whereClause
// DB QUERY - findOne
var whereResult = db.workspace.findOne(whereClause);
// DB QUERY - remove
db.workspace.remove({ "GUID": whereClause.GUID });
if (whereResult == null)
alert("Fail");
else
alert("Pass");
在 SQL 中我想要的可以这样表达:(伪语法)
if (
Select Count(*) from ((Select 1 as A, 2 as B) Data where B = 2) Result
) = 1 then 'pass' else 'fail'
上面的查询实际上从未接触过表——这是我的主要目标。
【问题讨论】:
-
嗯,有人有什么有用的贡献吗?
-
您是否只想测试您的查询是否适用于开发目的?还是这应该是您的应用程序中的行为?
-
这是我的应用程序中的行为 - 我需要运行多个查询,并且每个请求的(插入、查找、删除)循环会大大增加我的应用程序的开销。这个测试检查剩下的 400 行 javascript 是否会正确执行,所以如果我能早点退出,我以后会省去很多麻烦。就上下文而言,我希望每秒执行 500 多次,因此我的代码中的每个数据库查询确实需要证明其存在的合理性。稍后我会进行其他更昂贵的查询,这可以防止这种情况发生,但它需要快速
-
这在 MongoDB 中真的很难做到吗?还是太琐碎以至于没人认为值得解释?
-
由于您尝试验证 where 子句而不实际将其发送到 MongoDB 服务器,因此这实际上是一个应用程序/驱动程序问题。我不知道有任何帮助。可以构造一个查询,该查询在您的驱动程序中可能在语法上有效,但作为服务器查询仍然没有任何意义。这似乎是过度优化:)。我建议查看new Bulk API in MongoDB 2.6;我认为实际上您想要的是在第一个错误时失败的有序批量写入。
标签: javascript sql performance mongodb optimization