在mongodb的运算符中

时间:2014-06-09 10:52:52

标签: mongodb mongodb-query aggregation-framework

enter image description here

这是我的收集结构伤害包含伤害数据我有两个伤害所以我想要那些伤害 例如我有2个ID(538d9e7ed173e5202a000065,538f21868a5fc5e01f000065)然后我必须得到第一个两个数组我用户IN运算符bt仍然得到所有3个数组..我尝试下面的查询

        db.users.find(
                   {"injury._id":{$in:[ObjectId("538d9e7ed173e5202a000065"),
                                       ObjectId("538f21868a5fc5e01f000065")]}
                   })

使用它我得到了所有3个阵列

1 个答案:

答案 0 :(得分:1)

您需要了解的是,您的查询旨在过滤“文档”,而不会过滤“文档内”数组的元素。为了实际过滤数组内容以进行多次匹配,您需要使用聚合框架:

db.users.aggregate([
    // Matches the "documents" containing those elements in the array
    { "$match": {
        "injury._id":{
            "$in": [
                ObjectId("538d9e7ed173e5202a000065"),
                ObjectId("538f21868a5fc5e01f000065")
            ]
        }
    }},

    // Unwind the array to de-normalize as documents
    { "$unwind": "$injury" },

    // Match the array members
    { "$match": {
        "injury._id":{
            "$in": [
                ObjectId("538d9e7ed173e5202a000065"),
                ObjectId("538f21868a5fc5e01f000065")
            ]
        }
    }},

    // Group back as an array
    { "$group": {
        "_id": "$_id",
        "injury": { "$push": "$injury" }
    }}

])

在MongoDB 2.6及更高版本中,您可以使用$map来过滤数组:

db.users.aggregate([
    // Matches the "documents" containing those elements in the array
    { "$match": {
        "injury._id":{
            "$in": [
                ObjectId("538d9e7ed173e5202a000065"),
                ObjectId("538f21868a5fc5e01f000065")
            ]
        }
    }},

    // Project with $map to filter
    { "$project": {
        "injury": {
            "$setDifference": [
                { "$map": {
                    "input": "$injury",
                    "as": "el",
                    "in": {
                        "$cond": [
                        {
                            "$or": [
                                    { "$eq": [ 
                                        "$$el._id"
                                        ObjectId("538d9e7ed173e5202a000065")
                                    ]},
                                    { "$eq": [ 
                                        "$$el._id"
                                        ObjectId("538f21868a5fc5e01f000065")
                                    ]}
                                ]
                            },
                            "$$el",
                            false
                        ]
                    }
                }}, 
                [false]
            ]
        }
    }}

])