Nosql couchdb中的完全连接/交叉

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:

我有一些文档有两组属性:tag和liue。以下是它们的外观示例:

{
  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"]
}
如何映射/缩减并查询数据库,以便仅检索符合以下条件的文档的交集:

  • 代替:[“法国”、“卢森堡”]
  • 标签:[“阳光”]
返回:doc1和doc3

我想不出map/reduce可以返回哪种格式,以便只能有一个查询。我现在做的是:将每个LIU/tag作为键和文档的id作为值发出,然后为每个键减少一个文档id数组。然后,我从我的应用程序查询这个视图,在应用程序端对文档进行交叉(只获取具有3个键(卢森堡、法国和sunny)的文档,然后使用这些文档的ID重新查询couchdb以检索实际的文档。我觉得这不是正确/最好的方法吗

我正在使用列表来完成交集工作,它工作得很好。但是我仍然需要执行另一个请求来使用文档ID获取文档。知道我可以做些什么来直接检索文档吗


谢谢!

这会很尴尬。基本的想法是,你必须构建一个视图,其中地图函数会发出标签和国家的所有可能组合作为键,并且没有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组合。