如果子文档存在,MongoDB更新字段

jpfvwuh4  于 2023-03-17  发布在  Go
关注(0)|答案(2)|浏览(119)

我只会发现相反的问题。但在我的例子中,我需要更新一个子文档 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存在,我需要更新changeTimestampchangeUser

daupos2t

daupos2t1#

您可以使用$cond和$exists之间的聚合。如果auditInfo存在,请使用$cond语句检查,然后执行查询。您可以在此处找到如何使用它:https://www.mongodb.com/docs/manual/reference/operator/aggregation/cond/

wfauudbj

wfauudbj2#

如果我没理解错的话,你可以在find对象中使用$exists,只更新auditInfo存在的值。
所以我认为你要找的是this query
并且可以翻译成C#代码变成这样(未经测试):

var filter = Builders<BsonDocument>.Filter.And(
    Builders<BsonDocument>.Filter.Eq("_id", new ObjectId("6409b3bdaa5da4b2cecb2fda")),
    Builders<BsonDocument>.Filter.Exists("auditInfo")
);

var update = Builders<BsonDocument>.Update.Set("auditInfo.changeTimestamp", DateTime.Now)
                                          .Set("auditInfo.changeUser", yourUser);

var result = await collection.UpdateOneAsync(filter, update);

相关问题