从MongoDB Java中的数组中删除文档

时间:2018-04-09 17:05:24

标签: java arrays json mongodb bson

我有一个看起来像这样的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);

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

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

2 个答案:

答案 0 :(得分:1)

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

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

    coll.updateOne(filter, update);

答案 1 :(得分:0)

更新记录以从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中创建数组大小的索引。

参考