MongoDB找到数组的交集

时间:2013-05-29 15:37:51

标签: arrays mongodb

文档:

order1.filter = ['tag1','tag2']
order2.filter = ['tag1','tag2','tag3']

想得到:

query ['tag1','tag2'] -> (only order1)
query ['tag1','tag2','tag3'] -> (order1 and order2)
query ['tag1','tag2','tag3','tag4', etc ] -> (order1 and order2)

and

query ['tag1','tag3'] -> (null)
query ['tag2','tag3'] -> (null)

所有值order.filter都必须在查询数组中

怎么做?尝试指令$ all,$ in :(

1 个答案:

答案 0 :(得分:0)

您可以使用聚合框架执行此操作(无法通过我知道的常规查找执行此操作)。

我认为这基本上是a duplicate,因此您可以根据以下内容调整代码:

//sample documents:
> db.docs.find({},{_id:0})
{ "order" : 1, "filter" : [ "t1", "t2" ] }
{ "order" : 2, "filter" : [ "t1", "t2", "t3" ] }
var tagArray = [ "t1", "t2" ];   // array to "match"
db.docs.aggregate( [
    {
        "$project" : {
            "order" : 1,
            "filter" : 1,
            "killFlag" : {
                "$const" : [
                    true,
                    false
                ]
            }
        }
    },
    {
        "$unwind" : "$filter"
    },
    {
        "$unwind" : "$killFlag"
    },
    {
        "$match" : {
            "$nor" : [
                {
                    "filter" : {
                        "$in" : tagArray
                    },
                    "killFlag" : true
                }
            ]
        }
    },
    {
        "$group" : {
            "_id" : "$order",
            "filter" : {
                "$addToSet" : "$filter"
            },
            "killFlag" : {
                "$max" : "$killFlag"
            }
        }
    },
    {
        "$match" : {
            "killFlag" : false
        }
    },
    {
        "$project" : {
            "_id" : 1,
            "filter" : 1
        }
    }
]);