当我索引嵌入式文档时,我在使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>"
}
]
}
答案 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" }
]
}
}
}