2017-06-01 41 views
0

我已經用Google搜索了一下,試過了這個,看起來好像不可能。也許(希望)有人知道更好:D如何在Cloudant查詢結果中省略嵌套對象中的字段?

因此,我有一個運行在Bluemix上的Cloudant數據庫,我都很新。 查詢,索引,視圖 ...在這裏掙扎了一下,但到目前爲止,我可以成功檢索文檔 - 在我的情況下通過timestamp過濾。現在我只想讓輸出更便利。

在我的數據庫中,我有文件結構如下所示:

{ 
    "_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" 
    ], 
    ... 
} 

查看如何"another_not_needed_key"fields,因爲,我不需要這些信息。現在我想爲lines陣列的對象中的不需要的字段做同樣的事情。

我讀的地方,對於數組,像

"results.lines.S1.[].needed_key" 

selector是可能的,雖然我也不知道我是否有任何結果的檢測這一點。總之:

問題:

  1. 將/應爲fields上述工作,過?即應該只輸出"S1"數組嵌套對象中的任何"needed_key"?還沒有成功呢。
  2. 可以概括一下"S1"嗎?與陣列中所有對象的[]一樣,我想要解決lines中的所有密鑰。因爲:有些可能包含"S1"作爲關鍵字,其他則不包含。總的來說,這裏有七個可能的密鑰,可變的組合。

如果有什麼不清楚的地方,我很樂意提供更多信息。提前致謝!

回答

1
  1. 無:(使用[]速記與文本型指數將輸出數組的全部內容,當你查詢。

  2. 不在Cloudant查詢,沒有:(最好的,你可以這樣做可能會將您的數據結構更改爲嵌套數組的位置,但這對篩選投影值沒有幫助。

  3. 您的查詢足夠複雜,可能需要創建編程搜索索引(即在設計中文件,而不是通過Cloudant查詢):https://console.ng.bluemix.net/docs/services/Cloudant/api/search.html#search(如果這個很容易混淆,下面有更多的上下文)。

在高層次上,它取決於您是如何通過Cloudant Query爲數據建立索引的。有兩種方法:"type": "json""type": "text"。文本類型可以使用[]表示法,而json類型不能。我將解釋當前的json類型方法,並將使用文本類型信息進行更新。這也是一個好主意:Cloudant/Mango selector for deeply nested JSONs

要備份一點:在Cloudant中,你不能真正做任何特別的查詢,這是你自從你走了這麼遠以來就知道的。在Cloudant/CouchDB中,索引必須存在才能查詢任何內容。 (默認爲"_id")。另外,還有多個索引引擎:1.用於創建二級索引的傳統基於Map的視圖,2. Lucene搜索索引以及3.地理空間索引。

Cloudant Query抽象了一些這種索引 - 然後查詢系統,但是你仍然需要告訴它如何索引。它可以創建兩種類型的索引:「json」(對應於上面的#1)和「文本」(上面的#2)。

根據您觀察到的行爲,它看起來像您在Cloudant查詢中創建了json類型的索引,並針對該語句發出選擇器語句。這裏是你可以用這種方法得到的最接近:

JSON型指數:

{ 
    "index": { 
    "fields": [ 
     "_id", 
     "timestamp", 
     "station", 
     "results" 
    ] 
    }, 
    "type": "json" 
} 

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" 
    } 
    ] 
} 

輸出:

{ 
"_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" 
} 

文本型選擇(更新以顯示一個更有趣的查詢)

{ 
    "selector": { 
    "results.lines.S1": { 
     "$elemMatch": {"needed_key": "foo"} 
    } 
    }, 
    "fields": [ 
    "_id", 
    "timestamp", 
    "station", 
    "results.lines.S1" 
    ] 
} 

輸出

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

希望有所幫助。

+1

非常感謝。我確實看了一下搜索索引,但只是一個很快的搜索索引,在我認定它太複雜之前; D。我試過你提出的json類型選擇器;因爲我只有7個可能的鍵,列出它們都是可以忍受的。然而,處理數組中的每一個項目都是不可行的,所以......我最終離開了查詢和輸出,讓我的API執行所有過濾工作。 –

+0

也適用:D祝你好運。 – brobes

相關問題