关于 mongo 数组更新操作, addToSet 全匹配并不能解决现在问题?
发布于 11 天前 作者 liangtongzhuo 251 次浏览 来自 问答

问题: 数组内如果存在数据就更新,不存在数组内就插入这条数据。

数据解构

{
    _id: "xxx",
    items: [
        {
            id: 1,
            val: 3
        },
         {
            id: 2,
            val: 3
        },
    ]
}

存在id为1则更新,不存在则插入时,惯用的 $addToSet 全匹配并不能解决这样的问题。 我看一个博客,目前的做法

var update = db.a.update({
    _id: 1,
    "mail.id": 9
},{
    "mail.$.tit": "333"
});

// 更新的文档数为0,代表不存这条数据,进行插入
if (update[0] === 0) {
  db.a.update({
    _id: 1,
    // A.这条尤其重要
    "mail.id": {
        $ne: 9
    }
  },{
    $push: {
        "mail" : { id: 9, title: "123" }
    }
  }
}

虽然 $ne 保证了原子性,但是还是需要两次 IO 操作,不知道有更好的方法吗? 博客地址: https://github.com/smallnewer/bugs/issues/19

回到顶部