【问题标题】:MongoDB find the intersection of arraysMongoDB找到数组的交集
【发布时间】:2013-05-30 00:09:05
【问题描述】:

文档:

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 :(

【问题讨论】:

标签: arrays mongodb


【解决方案1】:

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

我认为这基本上是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
        }
    }
]);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-04-04
    • 2013-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多