使用数组源

时间:2016-09-29 15:33:06

标签: mongodb aggregation-framework

我有这份文件的结构:

{
    Id: "id_value",
    Elements:[
                {
                    InnerId: "inner_id_value1",
                    Value: "apple"
                },
                {
                    InnerId: "inner_id_value2",
                    Value: "pear"
                },
                {
                    InnerId: "inner_id_value3",
                    Value: "banana"
                }
             ]
}

我需要做的是创建一个查询,在输入中接收一个数组(例如["apple","banana","coconut"])并返回给我:

{
    Id: "id_value",
    Elements:[
                {
                    InnerId: "inner_id_value1",
                    Value: "apple"
                },
                {
                    InnerId: "inner_id_value3",
                    Value: "banana"
                }
             ]
}

是否可以使用单个查询在Mongo中执行此操作?

1 个答案:

答案 0 :(得分:3)

您只需要$filter数组并仅保留是输入数组子集的子文档。请注意, value 这里是一个元素数组,其中element是嵌入字段value

let fruits = ["apple","banana","coconut"];

db.collection.aggregate([
    { "$project": { 
        "Element": { 
            "$filter": { 
                "input": "$Element", 
                "as": "el", 
                "cond": { 
                    "$setIsSubset": [ [ "$$el.Value" ], fruits ] 
                 }
            }
        }
    }}
])

从MongoDB 3.4 *开始,您可以在$in阶段使用$project运算符。

db.collection.aggregate([
    { "$project": { 
        "Element": { 
            "$filter": { 
                "input": "$Element", 
                "as": "el", 
                "cond": { 
                    "$in": [ "$$el.Value", fruits ] 
                 }
            }
        }
    }}
])

*撰写本文时尚未发布的MongoDB版本