MongoDB:使用多键可以进行范围查询吗?

时间:2011-03-04 00:06:49

标签: mongodb indexing

var jd = {
  type: "Person",
  attributes: {
    name: "John Doe",
    age: 30
  }
};

var pd = {
  type: "Person",
  attributes: {
    name: "Penelope Doe",
    age: 26
  }
};

var ss = {
  type: "Book",
  attributes: {
    name: "The Sword Of Shannara",
    author: "Terry Brooks"
  }
};

db.things.save(jd);
db.things.save(pd);
db.things.save(ss);
db.things.ensureIndex({attributes: 1})
db.things.find({"attributes.age": 30}) // => John Doe
db.things.find({"attributes.age": 30}).explain() // => BasicCursor... (don't want a scan)
db.things.find({"attributes.age": {$gte: 18}) // John Doe, Penelope Doe (via a scan)

目标是通过范围查询索引和搜索所有属性,并且实际使用索引(与集合扫描相反)。没有人知道文档会有什么属性。我已经阅读过有关多键的信息,但它们似乎只能通过精确匹配查询(按索引)工作。

Multikeys更喜欢这种格式的文档:

var pd = {
  type: "Person",
  attributes: [
    {name: "Penelope Doe"},
    {age: 26}
  ]
};

是否存在一种模式,通过一个索引,我可以使用范围按属性查找项目?

编辑:

在无模式数据库中,有可能存在无限的类型数组,但集合名称实际上意味着某种类型。但是,如果我们走向极端,我们希望在集合中允许任意数量的类型(这样我们就不必为用户可能想象的每种可想到的自定义类型定义集合)。因此,通过仅使用单个深度索引(支持远程查询)的属性(任何类型)进行搜索使得这种事情更加可行。在我看来,这非常适合无模式数据库。

如果你想投票,打开一张票:

http://jira.mongodb.org/browse/SERVER-2675

2 个答案:

答案 0 :(得分:0)

是范围查询适用于多键。但是,多键是用于数组而不是嵌入对象。

在上面的示例中,尝试

db.things.ensureIndex({"attributes.age": 1})

答案 1 :(得分:-3)

使用多键可以进行范围查询;但是,表达查询可能很棘手。