MongoDB确定记录是否会传递findOne

时间:2014-07-13 18:34:34

标签: javascript sql performance mongodb optimization

我想知道如何在不实际执行数据库查询的情况下执行以下操作。即我想知道“someData”是否会传递“whereClause”而不将其放入表中并再次要求它返回。即在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'

以上查询实际上从未触及过表格 - 这是我的主要目标。

2 个答案:

答案 0 :(得分:0)

好的,我把这个问题带到MongoDB支持(10gen),并向他们征求意见。似乎没有句法说出我想说的话。他们的建议是使用一个单独的mongodb实例尽可能靠近应用程序,并将其用于此目的,以避免由于锁定等导致的任何潜在减速。

所以解决方案是:在应用程序本地创建一个新的MongoDB实例,并在那里运行这些查询。这将是唯一的方法。

我会向任何可以提供更好解决方案的人开放这个问题。

答案 1 :(得分:0)

好的,上面的Stennie(在评论中)提供了我认为对这种情况最好的答案的线索。

他提供了以下链接: what Javascript library can evaluate MongoDB-like query predicates against an object?

这让我有了2个javascript库:
1)Mingo - https://github.com/kofrasa/mingo
2)筛选 - https://github.com/crcn/sift.js

Mingo具有能够评估MongoDB语法的优势,其中Sift似乎更完整。对于我的情况,明戈是完美的,正是我所寻找的。

(我不知道如何给Stennie这个答案,但它真的属于他)