MongoDB - индексирование встроенных ключей, когда встроенные ключи являются URI - PullRequest
2 голосов
/ 04 октября 2010

У меня проблема с получением индексов в 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 ]

2 голосов
/ 05 октября 2010

У вас не может быть точек в ключах.

Драйвер должен отклонить это до того, как он попадет в базу данных.

1 голос
/ 05 октября 2010

Точки и $ являются разрешенными символами и не могут использоваться в имени свойства, поскольку они имеют особое значение для сервера.$ используются для обозначения операторов сервера.Точки используются для краткой записи свойств в вложенных документах.

Краткий пример: db.postings.find ({"author.name": "joe"});

Подробнее об этом можно прочитать здесь: http://www.mongodb.org/display/DOCS/Dot+Notation+%28Reaching+into+Objects%29

Один из способов решить эту проблему - это кодировать.и $ с некоторыми другими значениями.Вторым способом может быть использование свойства url под элементом.

<code>
{ 
  name: "some-name",
  graph: 
  { 
    site1: 
    {
        url:"http://example.org/subject",
        predicates : 
        [ 
          { "url":"http://example.org/predicate", "value" : "http://example.org/object", "type" : "uri" } 
        ] 
    }
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...