2015-02-24 134 views
1

我有以下類型的文檔的CouchDB數據庫,表示在建築物內發生的事件:Couchdb:是否可以從另一個視圖中查詢視圖?

{ person: 1 
    timestamp: 1 
    event: { type: enter 
      room: b } 
} 

{ person: 2 
    timestamp: 5 
    event: { type: leave 
      room: b } 
} 

,我要解決的問題是:我想要知道每個其他人在同一個房間裏與人1的時間總和。請注意,任何人都可以在許多不同的時間進入和離開很多房間。我真的不知道MapReduce是否是最好的範例,或者我應該只導出數據並編寫一個單獨的腳本來計算這些東西(儘管這可能不是我們的生產環境的可行解決方案)。

作爲一個開始的解決方案,我們假設所有的數據都是健全的,因此進入房間的人也會在稍後離開那個房間。然而,在最終的解決方案中,這個要求可能不得不放寬,因爲有些事件可能會丟失。

我想到了一個潛在的解決方案,但我不知道這是否可能或者如何在couchdb中完成此操作。這是一個大綱。

  1. 創建發射以下格式中,對於每個人進入房間事件的視圖:

    { [room, person, timestamp], null }

  2. 創建用於每一次的人1退出的房間發出{ [room, timestamp], null}的圖(可能適用於所有人,但沒有必要)。

  3. 創建一個視圖,爲每個退出除人1以外的任何人的房間事件,執行以下操作。在映射步驟:

    • 查詢第一種觀點找到最後的時間戳當人進入房間。
    • 查詢第一種觀點找到任何時候退出的那個人1進入那個房間
    • 對於每一個那個時代的房間時,查詢第二種觀點找到那個房間所有的退出時間前,和爲每個間隔檢查重疊是什麼。
    • 琛這些重疊在一起,併發出爲{ person, time }

減少: 每個人,所有的時間加在一起。

但是,這依賴於我能夠弄清楚如何從視圖中查詢不同的視圖。有人知道這是否可能,如果有,如何?

+0

我不確定自己完全瞭解您的需求,但您可能想嘗試使用變更Feed運行視圖,以便在人員1離開時獲取房間中的所有人員。然後運行你的第二個視圖,這是假設你的事件被記錄在同一個人的文檔中。希望這可以幫助。至於你的問題,我認爲你不能在視圖中調用一個視圖。 – twilson63 2015-02-25 11:54:17

+0

我的問題是,我想在所有事情發生後(每個人都離開大樓)這樣做:我想知道人們在同一個房間裏共同度過的總時間,所以雖然我可以做到(幾乎:必須檢查每個出口事件也是如此)與您的解決方案爲每個房間,我仍然需要在最後總結他們。但是,還有第二個問題,我沒有人員文件,而是事件文件。因此我必須將不同的人物ID(他們的進入和離開事件)聯繫起來,因此需要不同的觀點(通過personID加入所有事件)。 – Acrofales 2015-02-25 13:33:37

+0

是否可以同時管理個人文檔和事件文檔,然後監視每個房間的事件文檔的[更改]輸入[輸入,離開],然後在輸入和每個房間退出時使用時間戳更新個人文檔。並在退出時計算房間中的總時間並將其應用於人員文檔。那麼你應該能夠創建一個視圖來關閉[房間,人員,總時間]。 – twilson63 2015-02-26 14:03:47

回答

0

我發現在CouchDB結構中執行此操作的唯一方法是使用列表函數。我創建了一個視圖,它只是以[building,timestamp]作爲關鍵字發出所有文檔。這有助於我查看視圖,以確保我有一天和一個建築物,使用startkey和endkey。

我現在創建一個列表函數,它只需要獲取視圖返回的所有文檔,並在javascript函數中執行處理。這在大多數情況下繞過了map-reduce框架,但是我可以考慮在CouchDB框架內完成此操作。顯然,使用CouchDB的RESTful API,可以使用任何其他腳本而不是使用列表函數來完成。

相關問題