更新MongoDB中对象数组的属性

时间:2018-03-19 14:37:11

标签: javascript node.js mongodb mongoose

我一直在为这个荒谬的时间而苦苦挣扎。

假设我有一个Cars的集合,每个文档都有子文档数组Parts

{
    _id: ObjectId('123'),
    model: 'Audi',
    color: 'Red',
    parts: [
        {
            _id: ObjectId('abc'),
            name: 'Tire',
        },
        {
            _id: ObjectId('def'),
            name: 'Engine',
        },
    ],
}

我希望使用以下JSON请求,更新所请求的Part _id的每个Car子文档的价格。

{
    _id: ObjectId('123'),
    parts: [
        {
            _id: ObjectId('abc'),
            price: 23,
        },
        {
            _id: ObjectId('def'),
            price: 35,
        },
    ],
}

更新文档后我期待的结果是:

{
    _id: ObjectId('123'),
    model: 'Audi',
    color: 'Red',
    parts: [
        {
            _id: ObjectId('abc'),
            name: 'Tire',
            price: 23,
        },
        {
            _id: ObjectId('def'),
            name: 'Engine',
            price: 35,
        },
    ],
}

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

目前,我可以使用两个查询完成此操作,首先获取文档,然后第二次更新(使用lodash)。

async (req, res) => {
    const body = req.body;
    const car = await Car.findById(body._id);
    const merged = car.parts.map(part => {
        return _.assign(part, _.find(body.parts, { _id: part._id })
    });
    const result = await Car.findByIdAndUpdate(merged._id, {
        $set: merged,
    }, {
        new: true,
    });
    res.json(result);
}

执行两个查询有点不理想,但我相信这可能是必要的。我只想使用一个查询来实现解决方案。

0 个答案:

没有答案