我只会发现相反的问题。但在我的例子中,我需要更新一个子文档 auditInfo,它可能存在也可能不存在。如果它不存在,应该忽略它。但在这种情况下,使用$set
操作符会创建字段。
如果它确实存在,那么我想使用$set
更新它,以更新子文档的单个字段。
到目前为止,我还没有找到任何解决方案。此外,我对整个文档使用了组合更新定义,所以这样就不可能在字段上执行另一个带有过滤器的updateOne
。唯一的方法要么是一个自动执行的操作符,要么是一些数组过滤器魔术(但由于子文档在文档的根,我猜数组过滤器在这里不起作用)。
这是我的文件:
{
"_id": {
"$oid": "6409b3bdaa5da4b2cecb2fda"
},
"Version": 1,
"auditInfo": {
"Version": 1,
"creationTimestamp": {
"$date": {
"$numberLong": "-62135596800000"
}
},
"changeTimestamp": {
"$date": {
"$numberLong": "1678359412574"
}
},
"creationUser": {
"$binary": {
"base64": "AAAAAAAAAAAAAAAAAAAAAA==",
"subType": "04"
}
},
"changeUser": {
"$binary": {
"base64": "KIvTths/Q1GsbEp1L04axA==",
"subType": "04"
}
}
},
"dataFieldContainerId": {
"$binary": {
"base64": "RFv0FiWNQOi5Ei9ZBlU/OA==",
"subType": "04"
}
},
"dataFields": [
...
]
}
如果子文档auditInfo
存在,我需要更新changeTimestamp
和changeUser
。
2条答案
按热度按时间daupos2t1#
您可以使用$cond和$exists之间的聚合。如果auditInfo存在,请使用$cond语句检查,然后执行查询。您可以在此处找到如何使用它:https://www.mongodb.com/docs/manual/reference/operator/aggregation/cond/
wfauudbj2#
如果我没理解错的话,你可以在
find
对象中使用$exists,只更新auditInfo
存在的值。所以我认为你要找的是this query
并且可以翻译成C#代码变成这样(未经测试):