当前位置: 首页 > 知识库问答 >
问题:

MongoDB Panache正在更新文档中的嵌套对象

麹高义
2023-03-14

我有一个模型看起来是这样的:

{
  "projectName": "MyFirstProject",
  "projectId": "1234",
  "testCaseList": [
    {
      "testCaseName": "TestCase1",
      "steps": [
        {
          "Action": "Click on this",
          "Result": "pass"
        },
        {
          "Action": "Click on that",
          "Result": "pass"
        }
      ]
    },
    {
      "testCaseName": "TestCase2",
      "steps": [
        {
          "Action": "Click on him",
          "Result": "pass"
        },
        {
          "Action": "Click on her",
          "Result": "pass"
        }
      ]
    }
  ]
}
default PanacheUpdate update(String update, Object... params)

我正在使用存储库模式,下面是我的代码片段:

List<TestCase> newTestCaseList = ...;
update("testCaseList", newTestCaseList).where("projectId=?1",projectId);

这实际上会引发以下错误:

org.bson.json.JsonParseException: JSON reader was expecting ':' but found ','.
at org.bson.json.JsonReader.readBsonType(JsonReader.java:149)
    at org.bson.codecs.BsonDocumentCodec.decode(BsonDocumentCodec.java:82)
    at org.bson.codecs.BsonDocumentCodec.decode(BsonDocumentCodec.java:41)
    at org.bson.codecs.BsonDocumentCodec.readValue(BsonDocumentCodec.java:101)
    at org.bson.codecs.BsonDocumentCodec.decode(BsonDocumentCodec.java:84)
    at org.bson.BsonDocument.parse(BsonDocument.java:63)
    at io.quarkus.mongodb.panache.runtime.MongoOperations.executeUpdate(MongoOperations.java:634)
    at io.quarkus.mongodb.panache.runtime.MongoOperations.update(MongoOperations.java:629)

我目前的做法

当前对我有效的是在更新嵌套对象时使用default void update(Entity Entity)。然而,这提出了几点考虑:

  1. 需要额外的代码来获取整个文档、解析和更新必需的字段
  2. 由于update(Entity Entity)在文档级别上工作,因此它还将更新文档中未更改的部分,这并不理想。

共有1个答案

孙明德
2023-03-14

我想遇到的错误说明了mongoDB的panache通过提供的标准PanacheQL的限制。

应该使用可以通过PanacheMongoEntityBase#MongoCollection访问的本机mongoDB Java API来解决这个问题:

mongoCollection().updateOne(
        eq("projectId", projectId),
        new Document("$set", new Document("testCaseList", newTestCaseList))
);
 类似资料:
  • 假设我们有以下集合,我对此没有什么问题: > 我想增加“item_name”的价格:“my_item_two”,如果它不存在,应该将它追加到“items”数组中。

  • 我想在具有指定 URL 的相应文档中将嵌套的“已爬行”更新为 True。 我对mongodb相当陌生,我似乎无法弄清楚这一点,非常感谢任何帮助。

  • 我试图更新嵌套数组中的对象,下面是我的状态示例。我试图在目标内更新对象,我成功地更新了对象。 但是 每次我更新任何对象。索引0处的对象将获得所有对象的副本。我更新的次数越多,它就会创建更多的副本,它们就会嵌套在索引0处的对象中。 索引0处的对象也将使用任何对象的最新更新进行更新。 keyName=列表中对象的索引。(位于“0”和“1”上方的两个值:{) 此外,如果你知道任何好的留档或规范化的教程,

  • 将mongodb与pymongo一起使用,我有以下文档: 我想更新示例子文档(这是一个数组元素,因为可能有多个示例)。我有以下代码,但它不工作... 谁能告诉我这个有什么问题吗?

  • 我需要更新Mongo DB中另一个文档内的数组中的一个文档

  • 我有一个深度嵌套的文档结构,如下所示: 我正在尝试更新集合以插入新配置,如下所示: 我正在mongo(Python)中尝试类似的内容: 但是,我得到了“如果没有包含数组的相应查询字段,则无法应用位置运算符”错误。在mongo这样做的正确方式是什么?这是mongo v2。4.1.