如何使用嵌入式子文档递归更新mongodb中的文档

时间:2019-04-09 22:49:01

标签: javascript node.js mongodb mongoose

哇,要解决这个问题变得异常令人沮丧,我花了数小时在SO和Google上找到解决方案,但无济于事。我需要知道(如果可能的话)在MongoDB中如何用另一个文档(第一个文档的子文档)递归更新文档,以便仅更新子文档中存在的文档中的字段。理想情况下,使用带有lodash / underscore的javascript Node猫鼬使事情变得花哨。

为简单起见,我在mongoDB中有这个现有文档:

Product
{
    id: 1
    count: 1,
    title: 'sample',
    array:[ 
        {
            a: {
                 A: "nestedField",
                 B: ["123", "456"],
                 C: {
                    id: 'xyz',
                    msgs: [
                        {
                            msg: 'hello'
                        },
                        {
                            msg: 'world'
                        }
                    ]
                 }
            },
            b: {
                oPrice: "9.0"
            },
            price: '10.0',
            img: "9072408.jpg",
            tags: [ "op", "ob", "os" ]
        }
    ]
}

我必须使用以下结构对其进行更新

product
{
    id: 1
    count: 1,
    title: 'sample2',
    array:[ 
        {
            a: {
                 A: "nestedField 2",
                 B: ["123", "456"],
                 C: {
                    id: 'xyz',
                    msgs: [
                        {
                            msg: 'hello'
                        },
                        {
                            msg: 'world 2'
                        }
                    ]
                 }
            },
            c: 'some new field',
            price: '10.0'
        }
    ]
}

请注意其结构与原始结构相同,但仅某些字段需要更新,例如标题,数组[0] .a.A,数组[0] .a.C.msgs 而其他人则没有。计数,数组[0] .a.B,数组[0] .a.C.id,数组[0]。价格 并且数组值中有一个新字段c,因此也需要添加。

我尝试了以下操作,但是这代替了整个文档,而不是用其新值更新任何现有字段,并且删除了原始文档中未包含在子文档中的字段,例如img和标签。

updateOne: {
   filter: { id : product.id },
   update: { $set: product },
   upsert: false
}

0 个答案:

没有答案