【问题标题】:Compare additional fields only if multiple matches?仅在多个匹配项时才比较其他字段?
【发布时间】:2013-02-07 20:45:28
【问题描述】:

我有由非唯一键索引的唯一文档。该文档的独特之处在于文档中多个键的组合。例如:

{
  first: 'John',
  last: 'Foo'
}
{
  first: 'Henry',
  last: 'Bar'
}
{
  first: 'Frank',
  last: 'Foo'
}
{
  first: 'John',
  last: 'Bar'
}

所以,基于上面的例子:如果我们想查询Frank 的名字,我们只会得到一个结果。理想情况下,由于我们只有一个结果,我们甚至不需要将姓氏与我们的查询进行比较。但是,如果我们查询名称 John,我们会得到两个结果,因此我们需要比较次要参数。

如何在 Mongo 中实现这种查询方式?如果只有一个匹配开始,目标只是节省不必要的比较。

请注意,我知道这种查询方式不能保证正确的文档。它假设主字段和每个后续字段匹配“足够好”以验证文档的身份,如果只有一个文档匹配。虽然如果有其他不太明显的原因不应该使用这种方法,请务必讨论它:)

【问题讨论】:

  • 任何原因添加limit(1)sort() 参数不起作用?
  • limit(1) 如果找到多个匹配项,则不会匹配第二个/etc 参数,因此您将无法过滤不正确的匹配项。至于sort(),我不这么认为.. 虽然也许有一些我不熟悉的排序用法
  • 所以您正试图阻止 MongoDB 在 Frank 案例中检查 last = 'Foo',纯粹是出于性能原因?
  • 是的。显然这个例子很简单,但我想在某些情况下,额外长度的性能,特别是复杂的,比较最好保存而不使用。想法?
  • 我的想法是,这不是一个非常有趣或有用的用例。 :)

标签: mongodb


【解决方案1】:

我根本不会担心这个,尤其是如果您对此有索引的话。 first, last 上的复合索引将仅扫描以“first”开头的索引元素。如果那是一份文件,那么它就会停止。如果你还需要匹配“last”,那么它会扫描索引的那些部分。

【讨论】:

  • > 如果您还需要匹配“last”,那么它将扫描索引的那些部分。
  • 在索引中根本不用担心“完全比较”查询...我会在周末尝试提出一个很好的例子
猜你喜欢
  • 1970-01-01
  • 2018-04-18
  • 2014-10-29
  • 1970-01-01
  • 2018-04-19
  • 2015-08-04
  • 1970-01-01
  • 1970-01-01
  • 2016-01-19
相关资源
最近更新 更多