mongo 查询某字段并修改,如果不存在,则添加字段

目前表 A 具有两个 doc:

{
    "id": 1,
    "arr": []
},
{
    "id": 2,
    "arr": []
}

其中 arr 是一个 doc 数组,里面将存储预期的 doc:

{
    "title": "xxx", // 值为字符串
    "num": 1 // 值为整型    
}

现在我想对表 A 做一个 FindOneAndUpdate 的操作,使其 id1 并且 arr.titleA 的数据,其 arr.num 可以自增 1,如果该数据不存在,则插入如下 doc:

{
    "title": "A",
    "num": 1
}

能否根据以下的操作进行填充达到上面的目的?

{
    // filter
    {
        "id": 1,
        // TODO
    },
    // update
    {
        // TODO
    },
    // option
    {}
}
阅读 1.9k
2 个回答

自问自答吧...

使用聚合管道进行更新:

{
    {
        "id": 1
    },
    [
        {
            "$set": {
                "arr": {
                    "$cond": [
                        {
                            "$in": ["A", "$arr.title"]
                        },
                        {
                            "$map": {
                                "$input": "$arr",
                                "$in": {
                                    "$mergeObjects": [
                                        "$$this",
                                        {
                                            "$cond": [
                                                {
                                                    "$eq": ["$$this.title", "A"]
                                                },
                                                {
                                                    "num": { "$add": ["$$this.num", 1] }
                                                },
                                                {}
                                            ]
                                        }
                                    ]
                                }
                            }
                        },
                        {
                            "$concatArrays": [
                                "$arr",
                                [{
                                    "title": "A",
                                    "num": 1
                                }]
                            ]
                        }
                    ]
                }
            }
        },
    ],
    {}
}

不需要这么复杂,用 upsert 即可。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题