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