MongoDB - 按子树查询

时间:2011-10-26 06:07:18

标签: mongodb

我的文档结构与下面显示的简化版本相同:

{
  some_other_props: { ... },
  systems: {
    sys1: {
      score: 24,
      metric: 52
    },
    another_sys: {
      score: 9,
      metric: 77
    },
    some_other_sys: {
      score: 12,
      metric: 5
    }
  }
}

我想返回score : { "$gte" : 15 }对于任何子文档都适用的所有文档。

我能想到这样做的唯一方法是在system中获取密钥列表,并将其连接到某种语句中。但似乎我做错了什么。

我可以重新格式化文档结构,以便每个系统都在自己的文档中......但some_other_props中有很多其他信息,现在重新格式化会很痛苦。

事实上,我正在尝试做一些更复杂的事情。返回同一系统的scoremetric之间的差异非常不同的所有文档。但在我能够做到这一点之前,我想确保我可以对子树进行简单的查询,如上所示。

有人可以建议如何查询MongoDB中的子树吗?

2 个答案:

答案 0 :(得分:3)

您应该考虑将子文档存储为数组:

{
  some_other_props: { ... },
  systems: 
    [ {id: 'sys1',
      score: 24,
      metric: 52
    },
    { id: 'another_sys',
      score: 9,
      metric: 77
    }]

}

然后您可以只查询find 'systems.score' : { '$gte' : 15 },如果您认为需要,还可以为'systems.score'构建索引。

答案 1 :(得分:0)

如果你现在正是得分的话,你可以做一个“或”查询:

$or : [{ systems.sys1.score : { "$gte" : 15 } }, {systems.another_sys.score : { "$gte" : 15 }}]

但这似乎是解决问题的一种蹩脚方式。所以我的建议是为system_scores制作一个不同的目录,它对system_props集合有多对一的引用。这样可以更容易查询。