MongoDB - 当嵌入密钥是URI时索引嵌入密钥

时间:2010-10-04 16:38:08

标签: indexing mongodb

当我索引嵌入式文档时,我在使MongoDB中的索引正常工作时遇到问题。如果内部键是一个简单的字符串,索引工作正常,但由于我的数据格式,内部键通常需要是URI,这似乎不起作用,当我尝试创建索引时查看Mongo日志它说创建了索引,但它将每个文档添加到索引中。

这种类型的属性名称上的索引不起作用是否有原因,我该怎么做才能避免此问题?

示例文档

{ 
  name: "some-name",
  graph: 
  { 
    "http://example.org/subject" : 
    {
        "http://example.org/predicate" : 
        [ 
          { "value" : "http://example.org/object", "type" : "uri" } 
        ] 
    }
  }
}

避免问题的备用架构

我现在已经改变了我的代码以使用替代模式来避免这个问题,因为URI现在总是值而不是属性名称,并且模式允许我正确地利用MongoDB中的多键索引:

{
  name : "some-name",
  graph : [
            { 
              "subject" : "<http://example.org/subject>" ,
              "predicate" : "<http://example.org/predicate>" ,
              "object" : "<http://example.org/object>"
            }
          ]
}

2 个答案:

答案 0 :(得分:2)

你不能在按键上有点。

驱动程序should reject this在到达数据库之前。

答案 1 :(得分:1)

Dots和$是已解析的字符,不能在属性名称中使用,因为它们对服务器有特殊含义。 $用于标记服务器运营商。点用于子文档中属性的简短表示法。

简短的例子: db.postings.find({“author.name”:“joe”});

您可以在此处详细了解: http://www.mongodb.org/display/DOCS/Dot+Notation+%28Reaching+into+Objects%29

解决这个问题的一种方法是编码。和$以及其他一些值。第二种方法是将url作为元素下面的属性。


{ 
  name: "some-name",
  graph: 
  { 
    site1: 
    {
        url:"http://example.org/subject",
        predicates : 
        [ 
          { "url":"http://example.org/predicate", "value" : "http://example.org/object", "type" : "uri" } 
        ] 
    }
  }
}