Indexing 如何在Cloudant查询结果中省略嵌套对象中的字段?

Indexing 如何在Cloudant查询结果中省略嵌套对象中的字段?,indexing,couchdb,ibm-cloud,cloudant,nosql,Indexing,Couchdb,Ibm Cloud,Cloudant,Nosql,我在谷歌上搜索并尝试了这一切,但这似乎是不可能的。也许(希望)有人更清楚:D 因此,我有一个在Bluemix上运行的Cloudant数据库,这对我来说都是非常陌生的。查询、索引、视图。。。这里有点困难,但到目前为止,我可以成功地检索文档——在我的例子中,是通过时间戳过滤的。现在我只想让输出更方便一点 在我的数据库中,我的文档结构如下: { "_id": "0048160a463a73faaa6c90f5af027772", "_rev": "1-ff6255309f1b873a4e482

我在谷歌上搜索并尝试了这一切,但这似乎是不可能的。也许(希望)有人更清楚:D

因此,我有一个在Bluemix上运行的Cloudant数据库,这对我来说都是非常陌生的。查询、索引、视图。。。这里有点困难,但到目前为止,我可以成功地检索文档——在我的例子中,是通过
时间戳
过滤的。现在我只想让输出更方便一点

在我的数据库中,我的文档结构如下:

{
  "_id": "0048160a463a73faaa6c90f5af027772",
  "_rev": "1-ff6255309f1b873a4e482310843a8a15",
  "timestamp": 1496275536932.6602,
  "results": {
    "lines": {
      "S1": [
        {
          "needed_key": "foo",
          "not_needed_key": 1
        }
      ],
      "S2": [
        {
          "needed_key": "bar",
          "not_needed_key": 1
        },
        {
          "needed_key": "foo_bar",
          "not_needed_key": 1
        }
      ],
      ...
    }
  },
  "station": "5002270",
  "another_not_needed_key": "something"
}
简而言之,我的Cloudant选择器看起来有点像:

{
  "selector": {
    "$and": [{
      "timestamp": {
        "$gte": from,
        "$lt": to
      },       
      "results.lines": {
        "$ne": {}
      }
    ]},
  "fields": [
    "_id",
    "timestamp",
    "station",
    "results"
  ],
  ...
}
查看
“另一个不需要的密钥”
如何不在
字段中,因为我不需要这些信息。现在我想对
数组的对象中不需要的字段做同样的事情

我在某个地方读到过,对于数组,类似

"results.lines.S1.[].needed_key"
作为一个
选择器
是可能的,尽管我甚至不确定我是否得到了任何测试结果。无论如何:

问题:

  • 上述内容是否也适用于
    字段
    ?也就是说,它是否应该只输出
    “S1”
    数组嵌套对象中任何对象的
    “所需密钥”
    ?还没有成功
  • 我能以某种方式概括一下
    “S1”
    ?与数组中所有对象的
    []
    一样,我希望对
    行中的所有键进行寻址。因为:有些可能包含
    “S1”
    作为键,而其他可能不包含。总的来说,这里有七个可能的键,它们的组合是可变的
  • 如果有什么不清楚的地方,我很乐意提供更多信息。提前谢谢

  • 否:(使用带有文本类型索引的
    []
    速记将在查询时输出数组的全部内容

  • 不在Cloudant查询中,不:(您最好将数据结构更改为具有嵌套数组的位置,但这无助于筛选投影值

  • 您的查询非常复杂,可能需要创建一个编程搜索索引(即,在设计文档中,而不是通过Cloudant查询):(如果这听起来令人困惑,下面还有更多上下文)

  • 在较高级别上,这取决于您如何通过Cloudant查询为数据编制索引。有两种方法:
    “类型”:“json”
    “类型”:“文本”
    。文本类型可以使用
    []
    notation,而json类型不能。我将解释当前的json类型方法,并使用文本类型信息进行更新。这也是一个很好的线程:

    补充一点:在Cloudant中,您不能真正执行任何临时查询,这一点您已经非常了解了。在Cloudant/CouchDB中,在您可以查询任何内容之前,必须存在索引。(默认情况下,您在
    “\u id”
    上获取主索引。)此外,还有多个索引引擎:1.用于创建二级索引的传统基于地图的视图,2.Lucene搜索索引,以及3.地理空间索引

    Cloudant Query抽象了一些索引,然后查询系统,但您仍然需要告诉它索引什么和如何索引。它可以创建两种类型的索引:“json”(对应于上面的#1)和“text”(对应于上面的#2)

    根据您观察到的行为,看起来您已经在Cloudant查询中创建了json类型索引,并针对该索引发出了选择器语句。下面是使用该方法可以得到的最接近的结果:

    json类型索引:

    {
      "index": {
        "fields": [
          "_id",
          "timestamp",
          "station",
          "results"
        ]
      },
      "type": "json"
    }
    
    {
     "_id": "fd298368a7a344b217698677f3f5a07d",
     "timestamp": 1496275536932.6602,
     "station": "5002270",
     "results": {
      "lines": {
       "S1": {
        "0": {
         "needed_key": "foo"
        }
       },
       "S2": {
        "0": {
         "needed_key": "bar"
        },
        "1": {
         "needed_key": "foo_bar"
        }
       }
      }
     }
    }
    
    json类型选择器

    {
      "selector": {
        "_id": {
          "$gt": 0
        }
      },
      "fields": [
        "_id",
        "timestamp",
        "station",
        "results.lines.S1.0.needed_key",
        "results.lines.S2.0.needed_key",
        "results.lines.S2.1.needed_key"
      ],
      "sort": [
        {
          "_id": "asc"
        }
      ]
    }
    
    输出:

    {
      "index": {
        "fields": [
          "_id",
          "timestamp",
          "station",
          "results"
        ]
      },
      "type": "json"
    }
    
    {
     "_id": "fd298368a7a344b217698677f3f5a07d",
     "timestamp": 1496275536932.6602,
     "station": "5002270",
     "results": {
      "lines": {
       "S1": {
        "0": {
         "needed_key": "foo"
        }
       },
       "S2": {
        "0": {
         "needed_key": "bar"
        },
        "1": {
         "needed_key": "foo_bar"
        }
       }
      }
     }
    }
    
    不幸的是,json类型方法要求您了解事物是如何嵌套的

    文本类型CQ方法无法满足您当前的需求,但我相信您可以得到以下最接近的方法:

    文本类型索引

    {
      "index": {
        "fields": [
          {"name": "_id", "type": "string"},
          {"name": "timestamp", "type": "number"},
          {"name": "station", "type": "string"},
          {"name":"results.lines.S1.[].needed_key", "type": "string"}
        ]
      },
      "type": "text"
    }
    
    文本类型选择器(更新以显示更有趣的查询)

    输出

    {
     "_id": "fd298368a7a344b217698677f3f5a07d",
     "timestamp": 1496275536932.6602,
     "station": "5002270",
     "results": {
      "lines": {
       "S1": [
        {
         "needed_key": "foo",
         "not_needed_key": 1
        }
       ]
      }
     }
    }
    

    希望这能有所帮助。

    非常感谢。我确实看了一下搜索索引,但只是一个非常快速的索引,在我认为它太复杂之前;D.我尝试了你建议的json类型选择器;因为我只有7个可能的键,列出它们都是可以接受的。但是,解决数组中的每一项都是不可行的,所以最终,查询和输出保持原样,让我的API完成所有过滤工作。