Как я могу создать индекс в RavenDb, который возвращает документы, отфильтрованные по более чем одному «подзначению» - PullRequest
2 голосов
/ 09 ноября 2011

У меня есть документ, содержащий список узлов, и мне нужно вернуть документы, отфильтрованные по нескольким узлам.

например. У меня есть 2 документа

doc1 = {nodes: [{name:"node1", state:"1"}, {name:"node2", state:"2"]}
doc2 = {nodes: [{name:"node1", state:"1"}, {name:"node2", state:"1"]}

Я хотел бы иметь возможность создать индекс, который будет выбирать документ на основе состояния обоих узлов:

то есть я бы хотел сделать что-то подобное:

from doc in docs
from node in doc.nodes
where (node.name == "node1" && node.state == "1")
&& (node.name == "node2" && node.state != "2")
select new { doc }

Это не работает, и я не нашел хороших примеров, делающих подобные вещи.

Извините за неясность:

from doc in docs.CorporateInsuranceOffer
from node in doc.offerDetails.nodes 
where (node.name == "radgjof" && node.state == "state4" )  
&& (node.name == "verdlagning" && node.state != "state4" )  
select new {created = doc.offerInfo.created, offerId = doc.offerInfo.offerId, changed = doc.offerInfo.changed, kennitala = doc.offerInfo.kennitala, owner = doc.offerInfo.owner } 

Это фактический запрос, он не вызывает ошибок, он просто не возвращает данных (но должен вернуть 2 документа - проверено с использованием одного из этих источников одновременно и сравнения результатов).

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

Ответы [ 2 ]

1 голос
/ 10 ноября 2011

Когда вы создаете индекс в RavenDB, вы на самом деле определяете функцию карты, которая будет отображать / извлекать некоторую информацию из ваших документов и передавать ее в Lucene для последующих запросов. Важно понимать, что «select» в вашем определении индекса linq должно выбирать критерии, по которым вы хотите выполнить запрос позже. Это означает, что вам нужно выбрать свойства, по которым вы хотите выполнить запрос, а не весь документ.

Либо определите индекс, который выглядит следующим образом

from doc in docs
from node in doc.nodes
select new { node.name, node.state }

или лучше, просто запросите все, что вам нужно (без предварительного определения индекса), и позвольте RavenDB выяснить, какой индекс вам нужен.

0 голосов
/ 21 октября 2014

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

т.е:.

(node.name == "node1" && node.state == "1") && (node.name == "node2" && node.state != "2")

Здесь «узел» - это один и тот же объект во всех случаях. Этот запрос всегда будет возвращать пустой набор.

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

from doc in docs
where (doc.nodes.ElementAt(0).name == "radgjof" && doc.nodes.ElementAt(0).state == "state4")
&& (doc.nodes.ElementAt(1).name == "verdlagning" && doc.nodes.ElementAt(1).state == "state4")
select new
{
    doc
};
...