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

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

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

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

{
    _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);
}

做两个查询有点不理想,但我认为这可能是必要的 . 我只想使用一个查询来实现解决方案 .