MongoDB:查询特定元素序列的数组

时间:2016-06-08 22:24:19

标签: mongodb aggregation-framework

上下文:

我们使用Mongo来持久访问访问我们客户网站的用户的会话信息。其中大部分只是会话元数据(原始时间,浏览器,操作系统,国家等等)。

其中一个领域是一个不起眼的网页'阵列。其中包括按用户访问时排序的一系列网站。很简单。然而,现在我们发现自己迫切需要按照它们相对于EACH OTHER在数组中出现的顺序来过滤它们,而不仅仅是它们出现在数组中。

实施例

考虑以下页面数组:

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

MongoDB中有没有办法查询说:"从db.sessions.pages中检索每个文件,其中B直接跟随C,D直接或间接跟随G AND整个序列以H结尾?

重申 - 此示例也应传递上述查询:

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

考虑到每个客户我们有成千上万的文件......我们希望以任何方式实现这种效果吗?我明白,如果是 - 它可能需要某种形式的聚合。或者我们只是通过选择Mongo来完全射击自己?

1 个答案:

答案 0 :(得分:0)

这是一项复杂的任务,即使在SQL中使用CTE时,它看起来并不容易。

imho这可以通过自定义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;
                }
            })
        }
    })