我有一个包含节点列表的文档,我需要返回由多个节点过滤的文档。
E.g。 我有2个文档
doc1 = {nodes: [{name:"node1", state:"1"}, {name:"node2", state:"2"]}
doc2 = {nodes: [{name:"node1", state:"1"}, {name:"node2", state:"1"]}
我希望能够创建一个索引,根据两个节点的状态选择一个doc:
我想做这类事情:
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个文档 - 通过一次使用1个数据进行验证并比较结果)。
我的问题似乎是我无法在同一文档中的2个不同节点上设置条件。
答案 0 :(得分:1)
在RavenDB中创建索引时,实际上定义了一个map-function,它将从文档中映射/提取一些信息并将它们传递给Lucene以供稍后查询。重要的是要了解linq索引定义中的“select”应该选择之后要查询的条件。这意味着您需要选择要查询的属性,而不是整个文档本身。
定义一个看起来像这个
的索引from doc in docs
from node in doc.nodes
select new { node.name, node.state }
或更好,只需查询您需要的任何内容(无需预先定义索引),让RavenDB找出您需要的索引。
答案 1 :(得分:0)
好吧,一个问题是你的查询永远不会返回结果,因为对于同一属性上的两个单独的值,节点名永远不会测试为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
};