MongoDB 确定一条记录是不是会通过 findOne

Posted

技术标签:

【中文标题】MongoDB 确定一条记录是不是会通过 findOne【英文标题】:MongoDB determine if a record would pass findOneMongoDB 确定一条记录是否会通过 findOne 【发布时间】: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;我认为实际上您想要的是在第一个错误时失败的有序批量写入。 【参考方案1】:

好的,所以我将此问题提交给 MongoDB 支持 (10gen) 并向他们征求意见。似乎没有句法方式来表达我想说的话。他们的建议是在尽可能靠近应用程序的地方使用单独的 mongodb 实例,并仅将其用于此目的,以避免由于锁定等导致任何潜在的减速。

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

我会将这个问题留给任何可以提供更好解决方案的人。

【讨论】:

【参考方案2】:

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

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

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

Mingo 的优势在于能够评估 MongoDB 语法,其中 Sift 似乎更完整。对于我的情况,Mingo 是完美的,正是我想要的。

(我不知道如何感谢 Stennie 这个答案,但它确实属于他)

【讨论】:

和题外话 - 如果你想从 c# 领域做到这一点 - 那么你可以使用库“侏罗纪”在你的应用程序中运行一个 javascript 引擎 - 那么甚至不需要去和 mongodb 交谈.. 我想到了推荐的两个工具,Mingo 是功能最完整,最接近 MongoDB 提供的工具。全面披露:我是作者 :) 是的,几个月后,我不后悔沿着明戈路走下去,感谢您的努力!

以上是关于MongoDB 确定一条记录是不是会通过 findOne的主要内容,如果未能解决你的问题,请参考以下文章

mongodb 查询数据

MongoDB常用命令

请教各位大神,用mongoose如何获取最新插入的一条数据的id

一日一技:如何正确获取 MongoDB 集合里面的最后一条数据

mongodb 插入之后怎样获取id

mongodb与SQL相应关系表