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

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

【问题讨论】:

    标签: node.js mongodb 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 插入时自动创建的)临时集合并进行查询。

    【讨论】:

      猜你喜欢
      • 2015-08-08
      • 1970-01-01
      • 1970-01-01
      • 2015-04-27
      • 1970-01-01
      • 2017-04-26
      • 2017-02-24
      • 2012-08-26
      • 1970-01-01
      相关资源
      最近更新 更多