如何在 couchdb 中索引多维数组

How to index multidimensional arrays in couchdb

我有一个多维数组,我想用 CouchDB 建立索引(实际上是使用 Cloudant)。我的用户有他们所属团队的列表。我想搜索以找到该团队的每个成员。因此,获取所有具有 id 为 79d25d41d991890350af672e0b76faed 的团队对象的用户对象。我试图在 "Teams.id" 上创建一个 json 索引,但它没有用,因为它不是一个直数组而是一个多维数组。

用户

{
 "_id": "683be6c086381d3edc8905dc9e948da8",
 "_rev": "238-963e54ab838935f82f54e834f501dd99",
 "type": "Feature",
 "Kind": "Profile",
 "Email": "gc@gmail.com",
 "FirstName": "George",
 "LastName": "Castanza",
 "Teams": [
  {
   "id": "79d25d41d991890350af672e0b76faed",
   "name": "First Team",
   "level": "123"
  },
  {
   "id": "e500c1bf691b9cfc99f05634da80b6d1",
   "name": "Second Team Name",
   "level": ""
  },
  {
   "id": "4645e8a4958421f7d843d9b34c4cd9fe",
   "name": "Third Team Name",
   "level": "123"
  }
 ],
 "LastTeam": "79d25d41d991890350af672e0b76faed"
}

您只需遍历 Teams 数组并为每个团队发出一个视图条目。

function (doc) {
  if(doc.Kind === "Profile"){
    for (var i=0; i<doc.Teams.length; i++) {
      var team = doc.Teams[i];
      emit(team.id, [doc.FirstName, doc.LastName]);
    }
  }
}

然后您可以通过像这样键入团队 ID 来查询具有特定团队 ID 的所有配置文件

.../view?key="79d25d41d991890350af672e0b76faed"

给予

{"total_rows":7,"offset":2,"rows":[
{"id":"0d15041f43b43ae07e8faa737f00032c","key":"79d25d41d991890350af672e0b76faed","value":["Adam","Alpha"]},
{"id":"68779729be3610fd8b52b22574000ae8","key":"79d25d41d991890350af672e0b76faed","value":["Bob","Bravo"]},
{"id":"9f97f1565f03aebae9ca73e207001ee1","key":"79d25d41d991890350af672e0b76faed","value":["Chuck","Charlie"]}
]}

或者您可以通过在查询中添加 &include_docs=true 来在结果中包含实际配置文件。

这很像我在 的回复,但这是适用于您的问题的交易:

运行 此查询的最简单方法是使用 "Cloudant Query"(或 "Mango",因为它在即将发布的 CouchDB 2.0 版本中被称为)——而不是传统的 MapReduce 视图索引CouchDB 中的系统。 (此博客涵盖差异:https://cloudant.com/blog/mango-json-vs-text-indexes/ and this one is an overview: https://developer.ibm.com/clouddataservices/2015/11/24/cloudant-query-json-index-arrays/)。

这是您的 CQ 索引应该是这样的:

{
  "index": {
    "fields": [
      {"name": "Teams.[].id", "type": "string"}
    ]
  },
  "type": "text"
}

以及后续查询的样子:

{
  "selector": {
    "Teams": {"$elemMatch": {"id": "79d25d41d991890350af672e0b76faed"}}
  },
  "fields": [
    "_id",
    "FirstName",
    "LastName"
  ]
}

您可以在 Cloudant 仪表板的 "Query" 部分或通过 curl 使用类似这样的东西自己尝试:

curl -H "Content-Type: application/json" -X POST -d '{"selector":{"Teams":{"$elemMatch":{"id":"79d25d41d991890350af672e0b76faed"}}},"fields":["_id","FirstName","LastName"]}' https://broberg.cloudant.com/teams_test/_find

该数据库是全球可读的,因此您可以在此处查看我在其中创建的示例文档:https://broberg.cloudant.com/teams_test/_all_docs?include_docs=true

挖掘宋飞正传主题 :D