couchdb可以循环吗

tec*_*dog 3 mysql loops for-loop couchdb

couchdb可以循环吗?

假设我有一个兴趣数据库,有 3 个字段 subject1、subject2、subject3。例如,猫、营养、头发或空间、望远镜、光学等。

一个人 (A) 有 10 个兴趣,每个兴趣由 3 个字段组成。

另外 10 个人 B、C、D...有 10 个兴趣,每个兴趣由 3 个主题组成。

当人 A 登录时,我希望系统搜索所有具有匹配兴趣的人。

在 javascript 中,我通常会循环遍历所有兴趣,然后使用两个循环找到匹配的兴趣。然后将匹配项存储在用户的另一个数据库中,例如“matchinginterests”。

与 mysql 相比,在 couchdb 中是否有任何简单的方法可以做到这一点——这看起来非常复杂。

谢谢,丹

Dom*_*nes 5

我想我明白你在问什么。使用 Map/Reduce 答案非常简单。

假设您有以下人员文档:

{
   "name": "Person A",
   "interests" [ "computers", "fishing", "sports" ]
}
{
   "name": "Person B",
   "interests" [ "computers", "gaming" ]
}
{
   "name": "Person C",
   "interests" [ "hiking", "sports" ]
}
{
   "name": "Person D",
   "interests" [ "gaming" ]
}
Run Code Online (Sandbox Code Playgroud)

您可能希望将您的密钥作为兴趣发出,并将值作为该人的姓名(或_id)。

function (doc) {
   for (var x = 0, len = doc.interests.length; x < len; x++) {
      emit(doc.interests[x], doc..name);
   }
}
Run Code Online (Sandbox Code Playgroud)

您的查看结果将如下所示:

  • 计算机 => 人 A
  • 计算机=> B 人
  • 钓鱼 => A 人
  • 游戏 => B 人
  • 游戏 => D 人
  • 徒步旅行 => C 人
  • 体育 => A 人
  • 体育 => C 人

要获取对计算机感兴趣的人员列表,您只需key="computers"作为查询字符串的一部分发送即可。

如果你想在你的地图中添加一个reduce函数,你可以简单地使用_count(使用编译的reduce函数的快捷方式),你可以检索所有具有特定兴趣的人的计数,你甚至可以使用它来限制你感兴趣的人查询以建立您的关系。