MongoDB Update数组元素(带密钥的文档)(如果存在),否则按下

时间:2016-12-24 18:56:09

标签: mongodb mongodb-query

我有这样的架构:

doc:
{
    //Some fields
    visits:
    [
        {
            userID: Int32
            time: Int64
        }
    ]

}

我想首先检查特定的userID是否存在,如果不存在,请推送包含userID和系统time的文档,否则只需更新time值。我知道$push$addToSet都无法做到这一点。同时使用$upsert:true不起作用,因为官方documentation建议说,在尝试插入时,DB将使用$作为字段名称而不是运算符。

请指导我这件事。感谢

1 个答案:

答案 0 :(得分:6)

您可以使用$addToSet将项目添加到数组中,并$set更新此数组中的现有项目。

如果在数组中找不到userID,以下内容会向数组中添加一个新项:

db.doc.update({
    visits: {
        "$not": {
            "$elemMatch": {
                "userID": 4
            }
        }
    }
}, {
    $addToSet: {
        visits: {
            "userID": 4,
            "time": 1482607614
        }
    }
}, { multi: true });

如果子文档数组项与userId匹配,则以下内容将更新它:

db.doc.update({ "visits.userID": 2 }, {
    $set: {
        "visits.$.time": 1482607614
    }
}, { multi: true });