【问题标题】:Remove document from array in MongoDB Java从 MongoDB Java 中的数组中删除文档
【发布时间】:2018-04-10 05:07:04
【问题描述】:

我得到了一个 JSON 字符串,看起来像这样:

String tmp = "[
   {
      "ID":"12",
      "Date":"2018-02-02",
      "ObjData":[
         {
            "Name":"AAA",
            "Order":"12345",
            "Extra1":{
               "Temp":"3"
            },
            "Extra2":{
               "Temp":"5"
            }
         },
         {
            "Name":"BBB",
            "Order":"54321",
            "Extra1":{
               "Temp":"3"
            },
            "Extra2":{
               "Temp":"5"
            }
         }
      ]
   }
]"

例如,我想从“ObjData”中删除“Order”等于“54321”的文档。我得到以下代码:

Document doc = new Document();
doc = Document.parse(tmp);

Document fields = new Document("ID", "12")
    .append("ObjData", Arrays.asList(new Document("Order", "54321")));

Document update = new Document("$pull", fields);

coll.updateOne(doc, update);

我正在尝试使用“pull”方法从“Order”等于 54321 的数组中删除整个文档,但由于某种原因它不起作用,我可能做错了什么。有人能指出问题吗?

此外,保持数组中文档计数的最佳方法是什么,以便在提取所有文档后从数据库中删除整个文档?添加某种“大小”属性并跟踪大小并在每次拉动后减小它会更好吗?

【问题讨论】:

    标签: java arrays json mongodb bson


    【解决方案1】:

    要从任何文档的内部数组中删除带有Order=54321 的文档(如果您不知道ID),您可以使用空过滤器,例如:

        Document filter = new Document();
        Document update = new Document("$pull", new Document("ObjData", new Document("Order", "54321")));
    
        coll.updateOne(filter, update);
    

    【讨论】:

      【解决方案2】:

      更新记录以从 ObjData 数组中删除值

      updateOne 方法的第一个参数是查找要更新的文档的查询,而不是完整的文档。

      因此,对于您的代码,假设 ID 是一个唯一值,并且您的集合中有一个项目的 ID "12"

      // { ID: "12" }
      Document query = new Document("ID", "12");
      
      // { ObjData: { $pull: { Order: "54321" } } }
      Document update = new Document("ObjData",
              new Document("$pull",
                      new Document("Order", "54321")
              )
      );
      
      coll.updateOne(query, update);
      

      或者,如果您想从数据库中的所有文档中删除订单,只需将query 替换为空的Document,即:

      // { <empty> }
      Document query = new Document();
      

      删除ObjData数组为空的记录

      至于大小为零时删除记录,可以使用带有$size的过滤器:

      db.myColl.deleteMany({ ObjData: { $size: 0 } })
      

      这也可以使用 Java 驱动程序实现:

      // { ObjData: { $size: 0 } }
      Document query = new Document("ObjData",
              new Document("$size", 0)
      );
      coll.deleteMany(query);
      

      请注意,对于大型集合(即 myColl 很大,而不是 ObjData 数组),这可能效果不佳。如果是这种情况,那么您可能希望单独跟踪大小(正如您在问题中暗示的那样)并对其进行索引以使其更快地搜索,因为您无法在 MongoDB 中创建数组大小的索引。

      参考文献

      【讨论】:

        猜你喜欢
        • 2013-07-23
        • 2021-11-18
        • 1970-01-01
        • 2015-05-01
        • 1970-01-01
        • 2019-06-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多