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

don't allow partially matching document to add to array with $push using updateOne function

使用 $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",
                    "claimed_at":"2020-08-31T17:18:52.818737",
                }
             ]
                
}

无法使用 $addToSet,因为 claimed_at 等其他字段值未知, 如果它只是像 user_id 那样匹配单个字段,它就可以工作, 我在这里遗漏了一些东西

db.claims.updateOne(
{
    "_id": ObjectId("5f50c93dda654e891c903efb"),
    "claims":{"$ne": {"username":"Foo"}}
},
{
   "$push":
               {
                  "claims":
                            {
                                "username": "Foo",
                                "claim_id":"12345",
                                "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",
        }
    }
})