问题描述
使用$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",}
}
})