如何根据现有的 mongoose 查询检查单个文档?

Posted

技术标签:

【中文标题】如何根据现有的 mongoose 查询检查单个文档?【英文标题】:How could I check a single document against an existing mongoose query? 【发布时间】:2013-11-14 09:44:22 【问题描述】:

我有一个 mongoose 查询保存在一个变量中,然后我有一个相同集合的随机 mongoose 文档,该查询已打开。我想知道我的文档是否与查询匹配。我知道我可以对集合运行查询,然后查看结果集是否包含文档,但我想节省一些性能并仅在一个文档上运行它。这可能吗?如果是,那怎么办?

【问题讨论】:

【参考方案1】:

虽然本地查询可能是可能的,但如果本地查询不可行,我建议您考虑这样做:

Example
   .findOne(existingQuery)
   .where('id').equals(compareTo.id)
   .select('id')
   .exec(function(err, doc) 
      if (!err && doc) 
         console.log('found it!');
      
   );

您要比较的文档有一个_id。所以,在上面,我已经通过了你提到的现有查询,并且还添加了对随机文档_id 的检查。 MongoDB 应该使用索引(正如您使用的 _id),然后运行您的查询。它尽可能少地返回(而不是完整的文档)。

虽然这要求对数据库执行查询,但它只会检查一个文档。

【讨论】:

findOne 会接受一个 Query 对象作为参数吗?【参考方案2】:

AFAIK 仅使用现有的 mongodb 工具,您不能这样做。然而,作为meteor.js framework 的一部分,他们有一个名为minimongo 的mongodb 接口子集的内存端口,包括大部分查询语义(我相信,这主要来自阅读文章而不是直接经验构建使用这些工具)。所以理论上你可以将你的文档添加到一个 1-document 数组(内存中的集合)并使用 minimongo 运行它。如果您尝试这样做并让它在流星之外工作,请告诉我,因为它在一般情况下以及用于测试时看起来都很方便!

另一个选项在总体方案中可能没有意义,除非您的主要收藏确实非常庞大,但我会提到只是因为我认为这是一个值得考虑的有效选项,那就是插入将您的单个文档放入一个新的(由 mongodb 插入时自动创建的)临时集合并进行查询。

【讨论】:

以上是关于如何根据现有的 mongoose 查询检查单个文档?的主要内容,如果未能解决你的问题,请参考以下文章

基于多个子文档的MongoDB/Mongoose查询

如何在 Mongoose 排序结束时保持空值? [复制]

Node.js 和 Mongoose 正则表达式查询多个字段

如何在 mongoose/mongodb 查询子文档中使用 mapreduce?

如何在 mongoose/mongodb 查询子文档中使用 mapreduce?

如何编写查询来检索每个匹配的子文档数组