删除数组

时间:2015-06-03 16:17:24

标签: mongodb

我有以下文件:

    {
    "grades" : [
        {
            "grade" : 80,
            "mean" : 75,
            "std" : 8,
            "otro" : [
                {
                    "i" : 1
                },
                {
                    "i" : 2
                }
            ]
        },
        {
            "grade" : 85,
            "mean" : 90,
            "std" : 5
        },
        {
            "grade" : 85,
            "mean" : 90,
            "std" : 5,
            "otro" : [
                {
                    "i" : 3
                },
                {
                    "i" : 4
                }
            ]
        },
        {
            "grade" : 85,
            "mean" : 95,
            "std" : 6
        },
        {
            "grade" : 90,
            "mean" : 85,
            "std" : 5,
            "otro" : [
                {
                    "i" : 5
                },
                {
                    "i" : 6
                }
            ]
        }
    ]
}

我想要做的是删除'otro.i'的子文档:2,我试过这个:

db.ejemplo.update(
    {
        _id: oid,
        'grades':
        {
            $elemMatch:
            {
                'otro':
                {
                    $elemMatch:
                    {
                        'i': 2
                    }
                }
            }
        }
    },
    {
        '$pull':
        {
            'grades':
            {
                'otro':
                {
                    'i':2
                }
            }
        }
    }
);

但这会删除键'i'等于2的所有子文档'otro',

这是之前:

{
            "grade" : 80,
            "mean" : 75,
            "std" : 8,
            "otro" : [
                {
                    "i" : 1
                },
                {
                    "i" : 2
                }
            ]
        }

这是在

之后
{
            "grade" : 80,
            "mean" : 75,
            "std" : 8
        }

但我想要的结果是:

{
            "grade" : 80,
            "mean" : 75,
            "std" : 8,
            "otro" : [
                {
                    "i" : 1
                }
            ]
        }

有什么想法吗?

1 个答案:

答案 0 :(得分:2)

使用 $ positional operator 更新文档。这标识了要更新的数组中的元素,而不显式指定元素在数组中的位置:

db.ejemplo.update(
{
    _id: oid,
    'grades':
        {
            $elemMatch:
            {
                'otro':
                {
                    $elemMatch:
                    {
                        'i': 2
                    }
                }
            }
        }
    },
    {
        '$pull': {
            'grades.$.otro': {"i": 2}                
        }
    }
)