在mongoDB中我想根据对象的其他元素值更新对象

时间:2018-04-13 11:14:13

标签: mongodb mongoose

我在MongoDB中有一个集合。

{
    "_id" : ObjectId("5aaf51369d8bdfe288d1cb71"),
    "companyName" : "ABC",
    "name" : "BCD",
    "buildInfo" : [ 
        {
            "Branch" : "IT",
            "Subjects" : [ 
                "Math", 
                "English", 
                "Computer", 
            ]
        }
    ],
    "currentDate" : ISODate("2018-03-14T14:09:24.374Z"),
    "lastModifiedBy" : "ABC.com"
}

我想在" buildInfo"中插入一个新对象。如果那个分支不会在那里。如果分支存在,我想更新"主题"。

我正在将Branch和Subjects传递给这个方法。

myDb.collection('ABCDEF').findAndModify( 
        {'name':'BCD', 'companyName': 'ABC'},
        [['_id','asc']],
        {
            $addToSet: {
                'buildInfo.$[i].Subjects': Subjects
            }
        },
        {  upsert: true, arrayFilters: [{ 'i.Branch': Branch }] }

但如果分支在那里它会更新,但如果没有分支,它就不会创建新对象。

1 个答案:

答案 0 :(得分:0)

Upsert仅适用于文档级别,不适用于嵌入式文档。

最简单的方法是发布3个连续更新:

myDb.collection('ABCDEF').findAndModify( 
    {'name':'BCD', 'companyName': 'ABC', '$or': [{'buildInfo':{'$exists': false}}, {'buildInfo': {'$not':{ '$type': 'array' }}}]},
    [['_id','asc']],
    {
        $set: { 'buildInfo': [] }
    },
    {  upsert: true}
)

接着是

myDb.collection('ABCDEF').findAndModify( 
    {'name':'BCD', 'companyName': 'ABC', 'buildInfo.Branch': {$nin: [Branch]}},
    [['_id','asc']],
    {
        $push: {
            { buildInfo: { Branch: Branch, Subjects: [] } }
        }
    }
)

接着是

myDb.collection('ABCDEF').findAndModify( 
    {'name':'BCD', 'companyName': 'ABC', 'buildInfo.Branch': Branch},
    [['_id','asc']],
    {
        $addToSet: {
            'buildInfo.$[].Subjects': Subject
        }
    }
)

第一个将空buildInfo数组添加到没有一个的文档中。第二个更新将具有特定Branch和空Subjects的子文档添加到没有分支的文档。最后一个查询将Subject添加到集合中。