不允许使用updateOne函数通过$ push将部分匹配的文档添加到数组中

问题描述

使用$push检查文档是否与$addToSet / updateOne中的数组('claims')中的现有文档部分匹配(2个或更多字段),并且不允许被推到数组

结构如下:

{
    "_id": ObjectId("5f50c93dda654e891c903efb"),"claims":[
                {
                    "username": "Foo","claim_id":"12345","claimed_at":"2020-08-31T17:18:52.818737",},{
                    "username": "Bar","claim_id":"54321",}
             ]
                
}

无法使用$addToSet,因为未知其他字段值,例如claimed_at, 如果仅像user_id那样匹配单个字段,则它起作用了, 我在这里错过了一些东西

db.claims.updateOne(
{
    "_id": ObjectId("5f50c93dda654e891c903efb"),"claims":{"$ne": {"username":"Foo"}}
},{
   "$push":
               {
                  "claims":
                            {
                                "username": "Foo","claimed_at":"2020-09-02T17:08:23.514342",}
                }
})

解决方法

您可以尝试使用$elemMatch$not

db.claims.updateOne({
    "_id": ObjectId("5f50c93dda654e891c903efb"),claims: {
        $not: {
            $elemMatch: {
                username: "Foo",claim_id: "12345"
            }
        }
    }
},{
    "$push": {
        "claims": {
            "username": "Foo","claim_id": "12345","claimed_at": "2020-09-02T17:08:23.514342",}
    }
})