MongoDB:使用$ filter(聚合)过滤子数组

时间:2017-06-30 13:49:06

标签: arrays mongodb mongodb-query

我从MongoDB开始,很抱歉,如果我的问题太基础了。 我在Mongo有一个具有以下结构的集合:

{
    nome: "Diego", contas: [ 
    {
        banco: "itau",
        tipo: "corrente",
        investimentos: [{
            tipo: "fundo",
            transacoes: [{
                numero: 1,
                valor: 1000,
                data: "24/06/2017"
            },
            {
                numero: 2,
                valor: 1500,
                data: "01/02/2017"
            }]
        },
        {
            tipo: "poupanca",
            transacoes: [{
                numero: 1,
                valor: 600,
                data: "20/06/2017"
            }]
        }]
    },
    {
        banco: "bradesco",
        tipo: "poupanca",
        investimentos: []
    },
    {
        banco: "santander",
        tipo: "juridica",
        investimentos: [{
            tipo: "pic",
            transacoes: [{
                numero: 1,
                valor: 100,
                data: "20/06/2017"
            },
            {
                numero: 2,
                valor: 100,
                data: "20/05/2017"
            },
            {
                numero: 3,
                valor: 100,
                data: "20/05/2017"
            }]
        }]
    }]
}

我希望过滤investimentos conta数组,以仅包含字段tipo等于fundo 的条目。 有我的疑问:

db.teste.aggregate([
{
    $project: {
        nome: 1,
        "contas.investimentos": {
            $filter: {
                input: "$contas.investimentos",
                as: "investimento",
                cond: { $eq: ["$$investimento.tipo", "fundo"]}
            }
        }
    }
}]);

结果是:

 {
    "_id" : ObjectId("59563cf574f77220ff2166ea"),
    "nome" : "Diego",
    "contas" : [ 
        {
            "investimentos" : []
        }, 
        {
            "investimentos" : []
        }, 
        {
            "investimentos" : []
        }
    ]
}

我无法理解为什么结果为null字段investimentos。 我认为iam处理子阵列的方式有问题,但我无法找到差距在哪里。 请有人帮帮我吗?

1 个答案:

答案 0 :(得分:1)

您必须使用contas来映射$filter值并转到investimentos db.teste.aggregate([{ $project: { nome: 1, contas: { $map: { input: "$contas", as: "contas", in: { banco: "$$contas.banco", tipo: "$$contas.tipo", investimentos: { $filter: { input: "$$contas.investimentos", as: "investimento", cond: { $eq: ["$$investimento.tipo", "fundo"] } } } } } } } }]);

这样的东西
object.issue.filter(cf_20 = value)