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

MongoDB determine if a record would pass findOne

本文关键字:findOne 是否 记录 一条 MongoDB      更新时间:2023-09-26

我想知道如何做下面的,而不是实际做DB查询。也就是说,我想知道如果"someData"会传递"where子句",而不把它放在一个表中,并要求它回来。例如,在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'

上面的查询从来没有真正接触到表——这是我的主要目标。

好的,所以我把这个问题带到MongoDB支持(10gen),并向他们征求意见。我想说的话似乎没有什么语法上的表达方式。他们的建议是使用一个单独的mongodb实例,尽可能靠近应用程序,并使用它只为了这个目的,避免任何潜在的减速,由于锁定等。

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

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

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

他提供了下面的链接:什么Javascript库可以评估类似mongodb的查询谓词对对象?

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

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

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