2012-01-13 2 views
1

Я использую RavenDB, и у меня возникли проблемы с извлечением определенного значения с помощью Lucene Query.Как извлечь свойство коллекции в корневой документ

Вот JSON в моем документе:

{ 
"customer" : "my customer" 
"locations": [ 
    { 
     "name": "vel arcu. Curabitur", 
     "settings": { 
     "enabled": true 
     } 
    } 
    ] 
} 

Вот мой запрос:

var list = session.Advanced.LuceneQuery<ExpandoObject>() 
    .SelectFields<ExpandoObject>("customer", "locations;settings.enabled", "locations;name") 
    .ToList(); 

Список заполняется и содержит кучу ExpandoObjects с потребительскими свойствами, но я не могу для жизнь меня получает местоположение -> имя или местоположение -> настройки -> разрешено возвращаться.

Является ";" или "." неправильное использование?

ответ

1

Похоже, что вы неправильно поняли концепцию индексов и запросов в RavenDB. Когда вы загружаете документ в RavenDB, вы всегда загружаете весь документ, включая все его содержимое, которое оно содержит. Поэтому в вашем случае, если вы загружаете клиента, у вас уже есть коллекция и все ее дети загружены. Это означает, что вы можете использовать стандартные linq-to-objects для извлечения всех этих значений, не нужно ничего особенного, например индексов или lucene.

Если вы хотите сделать это извлечение на стороне базы данных, чтобы вы могли запрашивать эти свойства, вам нужен индекс. Индексы записываются с использованием linq, но важно понимать, что они запускаются на сервере и просто извлекают некоторые данные для заполнения индекса lucene. Но и здесь, в большинстве случаев, вам даже не нужно писать индексы самостоятельно, потому что RavenDB может создавать их автоматически для вас.

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

Надеюсь, это имеет смысл для вас. Если нет, уточните свой вопрос и расскажите нам больше о том, что вы на самом деле хотите сделать.

+0

Я не ищу, чтобы загрузить весь документ. Я просто хочу извлечь определенные значения из всех документов. Я не могу создать индекс, используя linq, потому что документы не хранятся с POCO только ExpandoObject или динамическими объектами. – legion

+0

Вы можете создать индекс, используя строку, которая будет обрабатываться на сервере. –

+0

Что вы понимаете, создавая индекс, используя строку? – legion

0

Технически вы можете использовать оператор запятой «,» для вставки в коллекции. Это должно работать, но это не рекомендуется. Вы можете просто получить весь свой объект и использовать его, это проще и быстрее.

Смежные вопросы