Nosql couchdb中的完全连接/交叉
我有一些文档有两组属性:tag和liue。以下是它们的外观示例:Nosql couchdb中的完全连接/交叉,nosql,couchdb,set,intersection,Nosql,Couchdb,Set,Intersection,我有一些文档有两组属性:tag和liue。以下是它们的外观示例: { title: "doc1", tag: ["mountain", "sunny", "forest"], lieu: ["france", "luxembourg"] }, { title: "doc2", tag: ["sunny", "lake"], lieu: ["france", "germany"] }, { title: "doc3", tag: ["sunny"], lieu:
{
title: "doc1",
tag: ["mountain", "sunny", "forest"],
lieu: ["france", "luxembourg"]
},
{
title: "doc2",
tag: ["sunny", "lake"],
lieu: ["france", "germany"]
},
{
title: "doc3",
tag: ["sunny"],
lieu: ["belgium", "luxembourg", "france"]
}
如何映射/缩减并查询数据库,以便仅检索符合以下条件的文档的交集:
- 代替:[“法国”、“卢森堡”]
- 标签:[“阳光”]
谢谢!这会很尴尬。基本的想法是,你必须构建一个视图,其中地图函数会发出标签和国家的所有可能组合作为键,并且没有reduce函数。这样,查找
[“法国”、“卢森堡”]
将返回发出该键的所有文档(因此处于交叉点),因为没有reduce函数的视图返回每个条目的发出文档。这样,您只需执行一个请求
这会导致大量的发射,但您可以通过在发射和搜索时对标记进行排序(自动将[“卢森堡”、“法国”]
转换为[“法国”、“卢森堡”]
),并利用CouchDB查询前缀的能力(这意味着发射[“比利时”、“法国”》,“卢森堡”]
将允许您匹配搜索[“比利时”]
和[“比利时”、“法国”]
)
在上面的示例中,对于这些国家,您只会排放:
// doc 1
emit(["luxembourg"],null);
emit(["france","luxembourg"],null);
// doc 2
emit(["germany"],null);
emit(["france","germany"],null);
// doc 3
emit(["luxembourg"],null);
emit(["belgium","luxembourg"],null);
emit(["france","luxembourg"],null);
emit(["belgium","france","luxembourg"],null);
无论如何,对于像这样的复杂查询,考虑一下一个CoucDB Lucene组合。
这将是很尴尬的。基本的想法是,你必须建立一个视图,其中MAP函数将标签和国家的每一个可能的组合都作为密钥,并且没有还原函数。这样,寻找<代码> [法国]。“卢森堡”]将返回发出该键的所有文档(因此位于交叉点),因为没有reduce函数的视图会为每个条目返回发出该键的文档。这样,您只需执行一个请求
这会导致大量的发射,但您可以通过在发射和搜索时对标记进行排序(自动将[“卢森堡”、“法国”]
转换为[“法国”、“卢森堡”]
),并利用CouchDB查询前缀的能力(这意味着发射[“比利时”、“法国”)“,”卢森堡“]
将允许您匹配搜索[“比利时”]
和[“比利时”、“法国”]
)
在上面的示例中,对于这些国家,您只会排放:
// doc 1
emit(["luxembourg"],null);
emit(["france","luxembourg"],null);
// doc 2
emit(["germany"],null);
emit(["france","germany"],null);
// doc 3
emit(["luxembourg"],null);
emit(["belgium","luxembourg"],null);
emit(["france","luxembourg"],null);
emit(["belgium","france","luxembourg"],null);
无论如何,对于像这样的复杂查询,考虑查看CoucDB Lucene组合。