2016-06-08 81 views
3

上下文:

我們使用Mongo來持續訪問訪問我們客戶網站的用戶的會話信息。其中大部分是簡單的會話元數據(起源時間,瀏覽器,操作系統,國家等)。MongoDB:查詢特定元素序列的陣列

其中一個領域是一個不起眼的'網頁'數組。它由用戶訪問時排序的一系列網站組成。夠簡單。但是現在我們發現自己迫切需要按照它們在數組中出現的順序來過濾它們,而不是簡單地將它們發生在數組中。

例子:

考慮以下頁面數組:

[ "A", "B", "C", "D", "E", "F", "G", "H" ] 

有MongoDB中的任何方式來查詢說:「檢索db.sessions.pages每一份文件,其中B是直接由跟隨c和d由G直接或間接地,隨後並用H整個序列結束

爲了重申 - 這個例子應該通過上述查詢以及:

[ "D", "A", "B", "A", "B", "C", "H" ] 

考慮到我們每個客戶端都有數十萬個文檔......我們希望以任何方式實現效果嗎?我明白如果是這樣 - 它可能需要某種形式的聚合。或者,我們是否只是通過選擇Mongo而完全在自己的腳下開槍?

+0

你說的* d由G *直接或間接其次是什麼意思?什麼是您的MongoDB版本? – styvane

+0

我們在生產中使用Mongo 3.2。 「直接」/「間接」功能應該很好,但對我們的場景來說不是必需的。 「元素B緊接着元素G」的意思是在表示網站序列的數組中,至少有一個這樣的子序列,如果B在第n個位置上,則G在第n + 1 。通過「元素B間接跟隨元素G」,我的意思是存在至少一個這樣的子序列,如果B在第n個位置上,則G在n + k上。 這個特定的功能不是至關重要的,但其他所有功能都是這樣的;) – Zardii

回答

0

這是一項複雜的任務,即使在SQL中使用CTE時也是如此,因爲它看起來並不容易。

恕我直言,這可以通過完成定製JS

var requiredSequence = [a, b] 
var requiredElement = 'g' 
    db.collection.find({}).forEach(function (doc) { 
     var arrayLenght = doc.array.lenght; 
     for (var i = 0; i < arrayLenght - 1; i++) { 
      if (doc.array[i] === requiredSequence[0] && doc.array[i + 1] === requiredSequence[1]) { 
       if (doc.array.indexOf(requiredElement) > -1) { 
        // we have all criteria meet 
        printjson(doc); 
        break; 
       } 
      }) 
     } 
    }) 
+0

因爲我在牀上☺我有一些想法,當想法不是迭代時如何改進數組搜索算法,但首先搜索索引位置然後匹配對於n + 1 ... – profesor79